<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<!-- 
	Copyright (C) 2007, 2008, 2009, 2010, 2011. PARP Research Group.
	<http://perception.inf.um.es>
	University of Murcia, Spain.

	This file is part of the QVision library.

	QVision is free software: you can redistribute it and/or modify
	it under the terms of the GNU Lesser General Public License as
	published by the Free Software Foundation, version 3 of the License.

	QVision is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU Lesser General Public License for more details.

	You should have received a copy of the GNU Lesser General Public
	License along with QVision. If not, see <http://www.gnu.org/licenses/>.
-->

<html><head><meta http-equiv="content-Type" content="text/html;charset=UTF-8">
<title>QVision: Qt&#39;s Image, Video and Computer Vision Library</title>
<meta name="title" content="QVision" />
<meta name="dc.title" content="QVision" />
<meta name="url" content="http://perception.inf.um.es/QVision" />
<meta name="author" content="PARP Research Group - http://perception.inf.um.es" />
<meta name="revisit-after" content="30 DAYS"/>
<meta name="robots" content="index,follow"/>
<meta name="classification" content="*">
<meta name="rating" content="Safe For Kids">
<meta name="distribution" content="GLOBAL"/>
<meta name="description" content="Qt's Image, Video and Computer Vision Library"/>
<meta name="page-topic" content="Computer Vision research and prototype programming"/>
<meta name="geo.country" content="ES" />

<!--
Keywords:
By license:		open source, gnu, lgpl, gpl, free
By theme:		computer vision, image processing, robotics, programming, source, development
By usage:		library, toolkit, framework, prototype, application
By programming specs:	object oriented, c++, block programming, reusability, gui, graphical, parallel computing, high performance, GPU, prototyping
Interoperability with:	Qt, GSL, GNU Scientific library, OpenCV, CGAL, QWT, CUDA, mplayer, IPP, Intel Image Performance Primitives, blas, lapack
Functionallity:		image features, matrix algebra, projective geometry, mser, function minimization, function optimization, canny operator, harris operator, corner detection, performance evaluation, cpu usage, graphical interface
Main data-types:	matrix, vector, tensor, quaternion, image, polyline
Video sources:		webcam, camera, stream
Devices:		embedded, desktop computer, laptop, mini-laptop
Authors:		PARP research group. University of Murcia, Spain.
-->

<meta name="keywords" content="augmented reality, sfm, structure from motion, open source, gnu, lgpl, gpl, free, computer vision, image processing, robotics, programming, source, development, library, toolkit, framework, prototype, application, object oriented, c++, block programming, reusability, gui, graphical, parallel computing, high performance, GPU, prototyping, Qt, GSL, GNU Scientific library, OpenCV, CGAL, QWT, CUDA, mplayer, IPP, Intel Image Performance Primitives, blas, lapack, image features, matrix algebra, projective geometry, mser, function minimization, function optimization, canny operator, harris operator, corner detection, performance evaluation, cpu usage, graphical interface, matrix, vector, tensor, quaternion, image, polyline, webcam, camera, stream, embedded, desktop computer, laptop, mini-laptop, University of Murcia, Spain, PARP research group, vision por computador"/>
<meta http-equiv="keywords" content="augmented reality, sfm, structure from motion, open source, gnu, lgpl, gpl, free, computer vision, image processing, robotics, programming, source, development, library, toolkit, framework, prototype, application, object oriented, c++, block programming, reusability, gui, graphical, parallel computing, high performance, GPU, prototyping, Qt, GSL, GNU Scientific library, OpenCV, CGAL, QWT, CUDA, mplayer, IPP, Intel Image Performance Primitives, blas, lapack, image features, matrix algebra, projective geometry, mser, function minimization, function optimization, canny operator, harris operator, corner detection, performance evaluation, cpu usage, graphical interface, matrix, vector, tensor, quaternion, image, polyline, webcam, camera, stream, embedded, desktop computer, laptop, mini-laptop, University of Murcia, Spain, PARP research group, vision por computador"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="title" content="QVision"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="tabs.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="favicon.ico" />
</head><body>

<table width="100%"><tr>
	<td><a href="http://perception.inf.um.es/"><img src="parp.png" border="0" /> <big>PARP Research Group</big></a></td>
	<td align="right"><a href="http://www.um.es/"><big>Universidad de Murcia</big> <img src="um.png" border="0" /></a></td>
</tr></table>

<hr /><br />

<table width="95%" align="center"><tr><td>

<!-- Generated by Doxygen 1.6.3 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
          <form id="FSearchBox" action="search.php" method="get">
            <img id="MSearchSelect" src="search/search.png" alt=""/>
            <input type="text" id="MSearchField" name="query" value="Search" size="20" accesskey="S" 
                   onfocus="searchBox.OnSearchFieldFocus(true)" 
                   onblur="searchBox.OnSearchFieldFocus(false)"/>
          </form>
        </div>
      </li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>src/qvblockprogramming/qvguiblocks/qvdesigner/qvdesignergui.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> *      Copyright (C) 2008, 2009, 2010, 2011, 2012. PARP Research Group.</span>
<a name="l00003"></a>00003 <span class="comment"> *      &lt;http://perception.inf.um.es&gt;</span>
<a name="l00004"></a>00004 <span class="comment"> *      University of Murcia, Spain.</span>
<a name="l00005"></a>00005 <span class="comment"> *</span>
<a name="l00006"></a>00006 <span class="comment"> *      This file is part of the QVision library.</span>
<a name="l00007"></a>00007 <span class="comment"> *</span>
<a name="l00008"></a>00008 <span class="comment"> *      QVision is free software: you can redistribute it and/or modify</span>
<a name="l00009"></a>00009 <span class="comment"> *      it under the terms of the GNU Lesser General Public License as</span>
<a name="l00010"></a>00010 <span class="comment"> *      published by the Free Software Foundation, version 3 of the License.</span>
<a name="l00011"></a>00011 <span class="comment"> *</span>
<a name="l00012"></a>00012 <span class="comment"> *      QVision is distributed in the hope that it will be useful,</span>
<a name="l00013"></a>00013 <span class="comment"> *      but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00014"></a>00014 <span class="comment"> *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00015"></a>00015 <span class="comment"> *      GNU Lesser General Public License for more details.</span>
<a name="l00016"></a>00016 <span class="comment"> *</span>
<a name="l00017"></a>00017 <span class="comment"> *      You should have received a copy of the GNU Lesser General Public</span>
<a name="l00018"></a>00018 <span class="comment"> *      License along with QVision. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<a name="l00019"></a>00019 <span class="comment"> */</span>
<a name="l00020"></a>00020 
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="comment">//#include &quot;qvdesignergui.h&quot;</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include &lt;QVDesignerGUI&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;QVApplication&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;QVPropertyContainer&gt;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;QVPropertyContainerChange&gt;</span>
<a name="l00027"></a>00027 <span class="comment">//#include &lt;QVMPlayerCamera&gt;</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;QVIndexedStringList&gt;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;QVVideoReaderBlock&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;QVProcessingBlock&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;QVImageCanvas&gt;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;QXmlStreamWriter&gt;</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include &lt;QXmlStreamReader&gt;</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &quot;../qvplot.h&quot;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &quot;facade/blockdialog.h&quot;</span>
<a name="l00036"></a>00036 <span class="comment">//#include &quot;facade/cameradialog.h&quot;</span>
<a name="l00037"></a>00037 <span class="preprocessor">#include &quot;<a class="code" href="imagecanvasdialog_8h.html" title="File from the QVision library.">facade/imagecanvasdialog.h</a>&quot;</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include &quot;<a class="code" href="camerablockdialog_8h.html" title="File from the QVision library.">facade/camerablockdialog.h</a>&quot;</span>
<a name="l00039"></a>00039 
<a name="l00040"></a><a class="code" href="classQVDesignerGUI.html#aa34bfa007333098027262b5cfac89f71">00040</a> <a class="code" href="classQVDesignerGUI.html#aa34bfa007333098027262b5cfac89f71" title="Constructs a QVDesignerGUI object.">QVDesignerGUI::QVDesignerGUI</a>(): QObject(), factory(), slate(this), informer(&amp;slate)
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042     qDebug() &lt;&lt; <span class="stringliteral">&quot;QVDesignerGUI::QVDesignerGUI()&quot;</span>;
<a name="l00043"></a>00043     <span class="keywordflow">if</span> (qvApp == NULL)
<a name="l00044"></a>00044         {
<a name="l00045"></a>00045         QString str =   <span class="stringliteral">&quot;QVDesignerGUI::QVDesignerGUI(): the SlateGUI cannot be created before the QVApplication instance. Aborting now.&quot;</span>;
<a name="l00046"></a>00046         std::cerr &lt;&lt; qPrintable(str) &lt;&lt; std::endl;
<a name="l00047"></a>00047         exit(1);
<a name="l00048"></a>00048         }
<a name="l00049"></a>00049 
<a name="l00050"></a>00050     <span class="comment">// if its a --help call, do nothing</span>
<a name="l00051"></a>00051     <span class="keywordflow">if</span> (qvApp-&gt;forHelp()) <span class="keywordflow">return</span>;
<a name="l00052"></a>00052 
<a name="l00053"></a>00053     connect(&amp;slate, SIGNAL(closed()), <span class="keyword">this</span>, SLOT(quit()));
<a name="l00054"></a>00054 
<a name="l00055"></a>00055     qvApp-&gt;registerGUI(<span class="keyword">this</span>);
<a name="l00056"></a>00056     qvApp-&gt;setTerminateOnLastBlock(<span class="keyword">false</span>); <span class="comment">// para que no termine cuando se resetea el escenario (y se quitan todos los blocks temporalmente)</span>
<a name="l00057"></a>00057 
<a name="l00058"></a>00058 <span class="comment">/*      // se conecta al informador estatico de la clase para obtener señales cuando se crea y se destruye un property container</span>
<a name="l00059"></a>00059 <span class="comment">    QVPropertyContainerInformer *inf = QVPropertyContainer::getGlobalInformer();</span>
<a name="l00060"></a>00060 <span class="comment">    connect(inf, SIGNAL(changed(QVPropertyContainerChange)), this, SLOT(processChange(QVPropertyContainerChange)));*/</span>
<a name="l00061"></a>00061 
<a name="l00062"></a>00062     qDebug() &lt;&lt; <span class="stringliteral">&quot;QVDesignerGUI::QVDesignerGUI() &lt;~ return&quot;</span>;
<a name="l00063"></a>00063 }
<a name="l00064"></a>00064 
<a name="l00065"></a>00065 <span class="keywordtype">void</span> <a class="code" href="classQVGUI.html#a73873873373076c825c28a86d8b19f58" title="initialice the QVGUI object.">QVDesignerGUI::init</a>()
<a name="l00066"></a>00066 {
<a name="l00067"></a>00067     <span class="comment">// registra y pinta los property containers</span>
<a name="l00068"></a>00068     <span class="keywordflow">foreach</span>(<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a>* qvp, qvApp-&gt;getQVPropertyContainers()) {
<a name="l00069"></a>00069         <span class="comment">// registro su tipo</span>
<a name="l00070"></a>00070         <a class="code" href="classQVProcessingBlock.html" title="Base class for Block threads.">QVProcessingBlock</a>* block;
<a name="l00071"></a>00071         <span class="keywordflow">if</span>((block = dynamic_cast&lt;QVProcessingBlock*&gt;(qvp)) != NULL) {
<a name="l00072"></a>00072             QString registered = factory.registerUserBlock(block);
<a name="l00073"></a>00073             <span class="keywordflow">if</span> (!registered.isEmpty())
<a name="l00074"></a>00074                 slate.includeItemType(registered);
<a name="l00075"></a>00075         }
<a name="l00076"></a>00076 
<a name="l00077"></a>00077         <span class="comment">// registra y pinta el property container</span>
<a name="l00078"></a>00078         QString type = factory.containerType(qvp);
<a name="l00079"></a>00079         QString name = qvp-&gt;<a class="code" href="classQVPropertyContainer.html#a82e880a6c160f3780bc8f7b822fbbd85" title="Retrieves identifier QString of the object.">getName</a>();
<a name="l00080"></a>00080         uint <span class="keywordtype">id</span> = qvp-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>();
<a name="l00081"></a>00081         <span class="comment">// no se incluye en &quot;containers&quot;, ya que no se pueden borrar desde aqui, ya que se crearon en el main y no con new. Se registra en &quot;initialContainers&quot;</span>
<a name="l00082"></a>00082         initialContainers.insert(<span class="keywordtype">id</span>, qvp);
<a name="l00083"></a>00083         createdItems.insert(<span class="keywordtype">id</span>, CreatedItem(type, name, <span class="keywordtype">id</span>));
<a name="l00084"></a>00084         <span class="comment">// se conecta al informador de ese container para obtener señales de sus cambios.</span>
<a name="l00085"></a>00085         connect(qvp-&gt;<a class="code" href="classQVPropertyContainer.html#a8c64c9c1074995778dbf8d517cd1c479" title="Gets the QVPropertyContainerInformer.">getInformer</a>(), SIGNAL(changed(QVPropertyContainerChange)), <span class="keyword">this</span>, SLOT(processChange(QVPropertyContainerChange)));
<a name="l00086"></a>00086         slate.addItemNode(type, name, <span class="keywordtype">id</span>, <span class="keyword">new</span> ItemProperties(type, qvp));
<a name="l00087"></a>00087         <span class="comment">// creo su dialogo</span>
<a name="l00088"></a>00088         createDialog(<span class="keywordtype">id</span>);
<a name="l00089"></a>00089     }
<a name="l00090"></a>00090 
<a name="l00091"></a>00091     <span class="comment">// una vez he registrado todos los property containers, registro y pinto los links de salida de cada uno (asi los pinto todos sin repetir)</span>
<a name="l00092"></a>00092     <span class="keywordflow">foreach</span>(<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a>* qvp, qvApp-&gt;getQVPropertyContainers()) {
<a name="l00093"></a>00093         <span class="keywordflow">foreach</span>(QString prop, qvp-&gt;<a class="code" href="classQVPropertyContainer.html#ad841530f023ade63674be20b9677b3cc" title="Gets list of properties of the QVPropertyContainer.">getPropertyList</a>()) {
<a name="l00094"></a>00094             <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *source = qvp-&gt;<a class="code" href="classQVPropertyContainer.html#a350c0c7a337fb173dbfe5b384cc615eb" title="Gets the source QVPropertyContainer of a given property.">getSourceContainer</a>(prop);
<a name="l00095"></a>00095             QString sourceProp = qvp-&gt;<a class="code" href="classQVPropertyContainer.html#aa88d1097bf52887c07e8cf1b15e98791" title="Gets the source property name of a given property.">getSourceProperty</a>(prop);
<a name="l00096"></a>00096             <span class="keywordtype">bool</span> sync = qvp-&gt;<a class="code" href="classQVPropertyContainer.html#adaa8f8488392d3080b7fa22613371356" title="Check if a property is linked syncronously.">isSynchronous</a>(prop);
<a name="l00097"></a>00097             <span class="keywordtype">bool</span> sequ = qvp-&gt;<a class="code" href="classQVPropertyContainer.html#a344fd4ac42cb3290c0ec1fe069036226" title="Check if a property is linked Sequentialy.">isSequential</a>(prop);
<a name="l00098"></a>00098 
<a name="l00099"></a>00099             <span class="keywordflow">if</span> ( (source != NULL) &amp;&amp; (!sourceProp.isEmpty()) ) {
<a name="l00100"></a>00100                 QString fromId = QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(source-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>());
<a name="l00101"></a>00101                 QString fromProp = sourceProp;
<a name="l00102"></a>00102                 QString toId = QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(qvp-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>());
<a name="l00103"></a>00103                 QString toProp = prop;
<a name="l00104"></a>00104                 QString linkName = getLinkName(fromId, fromProp, toId, toProp);
<a name="l00105"></a>00105                 createdLinks.insert(linkName, CreatedLink(source-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>(), fromProp, qvp-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>(), toProp, sync, sequ));
<a name="l00106"></a>00106                 slate.addLinkLine(source-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>(), fromProp, qvp-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>(), toProp, sync, sequ);
<a name="l00107"></a>00107 <span class="comment">//                              informer.inform(QString(&quot;Link añadido: &quot;) + getLinkName(fromName, fromProp, toName, toProp));</span>
<a name="l00108"></a>00108             }
<a name="l00109"></a>00109         }
<a name="l00110"></a>00110     }
<a name="l00111"></a>00111 
<a name="l00112"></a>00112     <span class="comment">// por último se pide a la vista, ahora que estan todos los nodos y links, que reordene los mismos</span>
<a name="l00113"></a>00113     slate.arrangeItems();
<a name="l00114"></a>00114 }
<a name="l00115"></a>00115 
<a name="l00116"></a>00116 <span class="keywordtype">void</span> <a class="code" href="classQVGUI.html#aeda9d300364e3f709b6ba1aaf76efcd3" title="show the QVGUI object.">QVDesignerGUI::show</a>()
<a name="l00117"></a>00117 {
<a name="l00118"></a>00118     slate.show();
<a name="l00119"></a>00119 }
<a name="l00120"></a>00120 
<a name="l00121"></a>00121 QMap&lt;QString, QList&lt;QString&gt; &gt; QVDesignerGUI::getItemTypes()<span class="keyword"> const</span>
<a name="l00122"></a>00122 <span class="keyword"></span>{
<a name="l00123"></a>00123     <span class="keywordflow">return</span> factory.getItemTypes();
<a name="l00124"></a>00124 }
<a name="l00125"></a>00125 
<a name="l00126"></a>00126 QMap&lt;QString, QList&lt;QString&gt; &gt; QVDesignerGUI::getInputItemTypes()<span class="keyword"> const</span>
<a name="l00127"></a>00127 <span class="keyword"></span>{
<a name="l00128"></a>00128     <span class="keywordflow">return</span> factory.getInputItemTypes();
<a name="l00129"></a>00129 }
<a name="l00130"></a>00130 
<a name="l00131"></a>00131 QMap&lt;QString, QList&lt;QString&gt; &gt; QVDesignerGUI::getMiddleItemTypes()<span class="keyword"> const</span>
<a name="l00132"></a>00132 <span class="keyword"></span>{
<a name="l00133"></a>00133     <span class="keywordflow">return</span> factory.getMiddleItemTypes();
<a name="l00134"></a>00134 }
<a name="l00135"></a>00135 
<a name="l00136"></a>00136 QMap&lt;QString, QList&lt;QString&gt; &gt; QVDesignerGUI::getOutputItemTypes()<span class="keyword"> const</span>
<a name="l00137"></a>00137 <span class="keyword"></span>{
<a name="l00138"></a>00138     <span class="keywordflow">return</span> factory.getOutputItemTypes();
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140 
<a name="l00141"></a>00141 uint QVDesignerGUI::addItem(QString type, QString name, uint lastId)
<a name="l00142"></a>00142 {
<a name="l00143"></a>00143     <span class="comment">//std::cout &lt;&lt; &quot;Creo &quot; + name.toStdString() + &quot;\n&quot;;</span>
<a name="l00144"></a>00144     <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *cont = factory.createContainer(type, name);
<a name="l00145"></a>00145     <span class="keywordflow">if</span> (cont != 0) {
<a name="l00146"></a>00146         containers.insert(cont-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>(), cont);
<a name="l00147"></a>00147         createdItems.insert(cont-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>(), CreatedItem(type, name, cont-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>()));
<a name="l00148"></a>00148         <span class="comment">// se conecta al informador de ese container para obtener señales de sus cambios.</span>
<a name="l00149"></a>00149         connect(cont-&gt;<a class="code" href="classQVPropertyContainer.html#a8c64c9c1074995778dbf8d517cd1c479" title="Gets the QVPropertyContainerInformer.">getInformer</a>(), SIGNAL(changed(QVPropertyContainerChange)), <span class="keyword">this</span>, SLOT(processChange(QVPropertyContainerChange)));
<a name="l00150"></a>00150 
<a name="l00151"></a>00151         slate.addItemNode(type, name, cont-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>(), <span class="keyword">new</span> ItemProperties(type, cont), lastId);
<a name="l00152"></a>00152         <span class="keywordflow">return</span> cont-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>();
<a name="l00153"></a>00153     }
<a name="l00154"></a>00154     <span class="keywordflow">return</span> 0;
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156 
<a name="l00157"></a>00157 <span class="keywordtype">bool</span> QVDesignerGUI::setName(<span class="keyword">const</span> uint <span class="keywordtype">id</span>, <span class="keyword">const</span> QString name)
<a name="l00158"></a>00158 {
<a name="l00159"></a>00159     <span class="keywordflow">if</span> (containers.contains(<span class="keywordtype">id</span>))
<a name="l00160"></a>00160         containers.value(<span class="keywordtype">id</span>)-&gt;setName(name);
<a name="l00161"></a>00161     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (initialContainers.contains(<span class="keywordtype">id</span>))
<a name="l00162"></a>00162         initialContainers.value(<span class="keywordtype">id</span>)-&gt;setName(name);
<a name="l00163"></a>00163     <span class="keywordflow">else</span>
<a name="l00164"></a>00164         <span class="keywordflow">return</span> FALSE;
<a name="l00165"></a>00165 
<a name="l00166"></a>00166     <span class="keywordflow">return</span> TRUE;
<a name="l00167"></a>00167 }
<a name="l00168"></a>00168 
<a name="l00169"></a>00169 <span class="keywordtype">bool</span> QVDesignerGUI::addLink(uint fromId, QString fromProp, uint toId, QString toProp, <span class="keywordtype">bool</span> synchronous, <span class="keywordtype">bool</span> sequential)
<a name="l00170"></a>00170 {
<a name="l00172"></a>00172     <span class="keywordflow">if</span> (containers.contains(fromId) &amp;&amp; containers.contains(toId)) {
<a name="l00173"></a>00173         <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *fromCont = containers.value(fromId);
<a name="l00174"></a>00174         <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *toCont = containers.value(toId);
<a name="l00175"></a>00175 
<a name="l00176"></a>00176         <a class="code" href="classQVVideoReaderBlock.html" title="This is a generic video input processing block for the QVision architecture.">QVVideoReaderBlock</a> *cameraBlock;
<a name="l00177"></a>00177         <a class="code" href="classQVPropertyContainer.html#a71d6042e94adbb6c46814e3593973a76" title="Semantics for a link between QVPropertyContainers.">QVPropertyContainer::LinkType</a> linkType = QVProcessingBlock::AsynchronousLink;
<a name="l00178"></a>00178         <span class="keywordflow">if</span> (synchronous) linkType = QVProcessingBlock::SynchronousLink;
<a name="l00179"></a>00179         <span class="keywordflow">if</span> (sequential) linkType = QVProcessingBlock::SequentialLink;
<a name="l00180"></a>00180 
<a name="l00181"></a>00181 
<a name="l00183"></a>00183         <span class="comment">/*if((dynamic_cast&lt;QVMPlayerCamera*&gt;(fromCont)) != NULL)</span>
<a name="l00184"></a>00184 <span class="comment">            fromCont-&gt;linkProperty(toCont, toProp, linkType);</span>
<a name="l00185"></a>00185 <span class="comment"></span>
<a name="l00186"></a>00186 <span class="comment">        else*/</span> <span class="keywordflow">if</span>((cameraBlock = dynamic_cast&lt;QVVideoReaderBlock*&gt;(fromCont)) != NULL)
<a name="l00187"></a>00187             cameraBlock-&gt;<a class="code" href="classQVVideoReaderBlock.html#a4330756e5e37295f500d223414eeca59" title="Links a QVImage&amp;lt;uChar,3&amp;gt; (RGB image) or QVImage&amp;lt;uChar,1&amp;gt; (gray image)...">linkProperty</a>(toCont, toProp);
<a name="l00188"></a>00188 
<a name="l00189"></a>00189         <span class="keywordflow">else</span> <span class="keywordflow">if</span>((dynamic_cast&lt;QVImageCanvas*&gt;(toCont)) != NULL)
<a name="l00190"></a>00190             fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#abd2a991c0bc91cee684ff3ffc80825dd" title="Links properties among QVPropertyContainer&amp;#39;s.">linkProperty</a>(fromProp, toCont, linkType);
<a name="l00191"></a>00191 
<a name="l00192"></a>00192         <span class="keywordflow">else</span> <span class="keywordflow">if</span>((dynamic_cast&lt;QVPlot*&gt;(toCont)) != NULL)
<a name="l00193"></a>00193             fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#abd2a991c0bc91cee684ff3ffc80825dd" title="Links properties among QVPropertyContainer&amp;#39;s.">linkProperty</a>(fromProp, toCont, linkType);
<a name="l00194"></a>00194 
<a name="l00195"></a>00195         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#a1f397287bc9c69b22aec208bddcc1d23" title="Check whether the property holder has a given property.">containsProperty</a>(fromProp))
<a name="l00196"></a>00196             fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#abd2a991c0bc91cee684ff3ffc80825dd" title="Links properties among QVPropertyContainer&amp;#39;s.">linkProperty</a>(toCont, toProp, linkType);
<a name="l00197"></a>00197 
<a name="l00198"></a>00198         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!toCont-&gt;<a class="code" href="classQVPropertyContainer.html#a1f397287bc9c69b22aec208bddcc1d23" title="Check whether the property holder has a given property.">containsProperty</a>(toProp))
<a name="l00199"></a>00199             fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#abd2a991c0bc91cee684ff3ffc80825dd" title="Links properties among QVPropertyContainer&amp;#39;s.">linkProperty</a>(fromProp, toCont, linkType);
<a name="l00200"></a>00200 
<a name="l00201"></a>00201         <span class="keywordflow">else</span>
<a name="l00202"></a>00202             fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#abd2a991c0bc91cee684ff3ffc80825dd" title="Links properties among QVPropertyContainer&amp;#39;s.">linkProperty</a>(fromProp, toCont, toProp, linkType);
<a name="l00203"></a>00203     }
<a name="l00204"></a>00204     <span class="keywordflow">else</span>
<a name="l00205"></a>00205         <span class="keywordflow">return</span> FALSE;
<a name="l00206"></a>00206 
<a name="l00207"></a>00207     <span class="keywordflow">return</span> TRUE;
<a name="l00208"></a>00208 }
<a name="l00209"></a>00209 
<a name="l00210"></a>00210 <span class="keywordtype">bool</span> QVDesignerGUI::delItem(<span class="keyword">const</span> uint <span class="keywordtype">id</span>)
<a name="l00211"></a>00211 {
<a name="l00212"></a>00212     <span class="keywordflow">if</span> (containers.contains(<span class="keywordtype">id</span>)) {
<a name="l00213"></a>00213         <span class="comment">// borramos el propertyContainer asociado</span>
<a name="l00214"></a>00214         factory.deleteContainer(containers.value(<span class="keywordtype">id</span>));
<a name="l00215"></a>00215         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00216"></a>00216     }
<a name="l00217"></a>00217     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00218"></a>00218 }
<a name="l00219"></a>00219 
<a name="l00220"></a>00220 <span class="keywordtype">bool</span> QVDesignerGUI::delLink(<span class="keyword">const</span> uint fromId, <span class="keyword">const</span> QString fromProp, <span class="keyword">const</span> uint toId, <span class="keyword">const</span> QString toProp)
<a name="l00221"></a>00221 {
<a name="l00222"></a>00222     <span class="keywordflow">if</span> (containers.contains(fromId) &amp;&amp; containers.contains(toId))
<a name="l00223"></a>00223         <span class="keywordflow">return</span> containers.value(fromId)-&gt;unlinkProperty(fromProp, containers.value(toId), toProp);
<a name="l00224"></a>00224     <span class="keywordflow">else</span>
<a name="l00225"></a>00225         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00226"></a>00226 }
<a name="l00227"></a>00227 
<a name="l00228"></a>00228 <span class="keyword">template</span> &lt;<span class="keyword">class</span> Type&gt; <span class="keywordtype">bool</span> QVDesignerGUI::setProperty(<span class="keyword">const</span> uint fromId, <span class="keyword">const</span> QString fromProp, <span class="keyword">const</span> Type &amp;value)
<a name="l00229"></a>00229 {
<a name="l00230"></a>00230     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00231"></a>00231 }
<a name="l00232"></a>00232 
<a name="l00233"></a>00233 QString QVDesignerGUI::getLinkName(QVPropertyContainerChange change)
<a name="l00234"></a>00234 {
<a name="l00235"></a>00235     <span class="keywordflow">return</span> getLinkName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(change.getOrigId()), change.getOrigProp(), QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(change.getDestId()), change.getDestProp());
<a name="l00236"></a>00236 }
<a name="l00237"></a>00237 
<a name="l00238"></a>00238 QString QVDesignerGUI::getLinkName(QString fromIdName, QString fromProp, QString toIdName, QString toProp)
<a name="l00239"></a>00239 {
<a name="l00240"></a>00240     <span class="keywordflow">return</span> getAbsPropName(fromIdName, fromProp) + <span class="stringliteral">&quot; =&gt; &quot;</span> + getAbsPropName(toIdName, toProp);
<a name="l00241"></a>00241 }
<a name="l00242"></a>00242 
<a name="l00243"></a>00243 QString QVDesignerGUI::getAbsPropName(QString fromIdName, QString fromProp)
<a name="l00244"></a>00244 {
<a name="l00245"></a>00245     <span class="keywordflow">return</span> fromIdName + <span class="stringliteral">&quot;[&quot;</span> + fromProp + <span class="stringliteral">&quot;]&quot;</span>;
<a name="l00246"></a>00246 }
<a name="l00247"></a>00247 
<a name="l00248"></a>00248 
<a name="l00249"></a>00249 <span class="keywordtype">void</span> QVDesignerGUI::processChange(QVPropertyContainerChange change)
<a name="l00250"></a>00250 {
<a name="l00251"></a>00251     <span class="keywordflow">switch</span> (change.getChangeType())
<a name="l00252"></a>00252     {
<a name="l00253"></a>00253     <span class="keywordflow">case</span> QVPropertyContainerChange::Name:
<a name="l00254"></a>00254         {
<a name="l00255"></a>00255             uint <span class="keywordtype">id</span> = change.getSourceId();
<a name="l00256"></a>00256             QString name = change.getSourceName();
<a name="l00257"></a>00257             <span class="keywordflow">if</span> (createdItems.contains(<span class="keywordtype">id</span>)) {
<a name="l00258"></a>00258                 <span class="comment">//std::cout &lt;&lt; change.toString().toStdString() &lt;&lt; std::endl;</span>
<a name="l00259"></a>00259                 slate.setItemName(<span class="keywordtype">id</span>, name);
<a name="l00260"></a>00260                 <span class="keywordflow">if</span> (createdItems.contains(<span class="keywordtype">id</span>)) createdItems[<span class="keywordtype">id</span>].name = name;
<a name="l00261"></a>00261             }
<a name="l00262"></a>00262         }
<a name="l00263"></a>00263         <span class="keywordflow">break</span>;
<a name="l00264"></a>00264 
<a name="l00265"></a>00265     <span class="keywordflow">case</span> QVPropertyContainerChange::ContainerDel:
<a name="l00266"></a>00266         {
<a name="l00267"></a>00267             uint <span class="keywordtype">id</span> = change.getSourceId();
<a name="l00268"></a>00268             containers.remove(<span class="keywordtype">id</span>);
<a name="l00269"></a>00269             createdItems.remove(<span class="keywordtype">id</span>);
<a name="l00270"></a>00270             slate.delItemNode(<span class="keywordtype">id</span>);
<a name="l00271"></a>00271 
<a name="l00272"></a>00272             <span class="comment">// si se ha creado su dialogo, tambien lo borramos</span>
<a name="l00273"></a>00273             deleteDialog(<span class="keywordtype">id</span>);
<a name="l00274"></a>00274 
<a name="l00275"></a>00275             <span class="comment">//std::cout &lt;&lt; change.toString().toStdString() &lt;&lt; std::endl;</span>
<a name="l00276"></a>00276         }
<a name="l00277"></a>00277         <span class="keywordflow">break</span>;
<a name="l00278"></a>00278 
<a name="l00279"></a>00279     <span class="keywordflow">case</span> QVPropertyContainerChange::PropertyAdd:
<a name="l00280"></a>00280         <span class="keywordflow">if</span> (createdItems.contains(change.getSourceId()))
<a name="l00281"></a>00281         {
<a name="l00282"></a>00282             uint srcId = change.getSourceId();
<a name="l00283"></a>00283             QString propName = change.getPropName();
<a name="l00284"></a>00284 
<a name="l00285"></a>00285             <span class="keywordflow">if</span> (containers.contains(srcId))
<a name="l00286"></a>00286             {
<a name="l00287"></a>00287                 <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *cont = containers.value(srcId);
<a name="l00288"></a>00288                 <span class="keywordtype">int</span> type = cont-&gt;<a class="code" href="classQVPropertyContainer.html#acabf023fd31ca114618a8f1e9e0215a3" title="Given a property identifying QString (see getPropertyList() function above), returns...">getPropertyType</a>(propName);
<a name="l00289"></a>00289                 <span class="keywordtype">bool</span> in = cont-&gt;<a class="code" href="classQVPropertyContainer.html#a81d9c28ff7aefe940b058d80a47eb93a" title="Tells if a property is of the input type.">isInput</a>(propName);
<a name="l00290"></a>00290                 <span class="keywordtype">bool</span> out = cont-&gt;<a class="code" href="classQVPropertyContainer.html#aa6edef6dbc24d47a88ebe7768eb0bbf0" title="Tells if a property is of the output type.">isOutput</a>(propName);
<a name="l00291"></a>00291                 slate.addProperty(srcId, propName, type, in, out);
<a name="l00292"></a>00292             }
<a name="l00293"></a>00293             <span class="comment">//std::cout &lt;&lt; change.toString().toStdString() &lt;&lt; std::endl;</span>
<a name="l00294"></a>00294         }
<a name="l00295"></a>00295         <span class="keywordflow">break</span>;
<a name="l00296"></a>00296 
<a name="l00297"></a>00297     <span class="keywordflow">case</span> QVPropertyContainerChange::PropertyDel:
<a name="l00298"></a>00298         <span class="keywordflow">if</span> (createdItems.contains(change.getSourceId()))
<a name="l00299"></a>00299         {
<a name="l00300"></a>00300             uint srcId = change.getSourceId();
<a name="l00301"></a>00301             QString propName = change.getPropName();
<a name="l00302"></a>00302             slate.delProperty(srcId, propName);
<a name="l00303"></a>00303             <span class="comment">//std::cout &lt;&lt; change.toString().toStdString() &lt;&lt; std::endl;</span>
<a name="l00304"></a>00304         }
<a name="l00305"></a>00305         <span class="keywordflow">break</span>;
<a name="l00306"></a>00306 
<a name="l00307"></a>00307     <span class="keywordflow">case</span> QVPropertyContainerChange::PropertyValue:
<a name="l00308"></a>00308         <span class="keywordflow">break</span>;
<a name="l00309"></a>00309 
<a name="l00310"></a>00310     <span class="keywordflow">case</span> QVPropertyContainerChange::LinkAdd:
<a name="l00311"></a>00311         {
<a name="l00312"></a>00312             uint fromId = change.getOrigId();
<a name="l00313"></a>00313             QString fromProp = change.getOrigProp();
<a name="l00314"></a>00314             uint toId = change.getDestId();
<a name="l00315"></a>00315             QString toProp = change.getDestProp();
<a name="l00316"></a>00316             QString linkName = getLinkName(change);
<a name="l00317"></a>00317             <span class="keywordflow">if</span> ( createdItems.contains(fromId) &amp;&amp; createdItems.contains(toId) )
<a name="l00318"></a>00318             {
<a name="l00319"></a>00319                 createdLinks.insert(linkName, CreatedLink(fromId, fromProp, toId, toProp, change.isSinc(), change.isSequ()));
<a name="l00320"></a>00320                 slate.addLinkLine(fromId, fromProp, toId, toProp, change.isSinc(), change.isSequ());
<a name="l00321"></a>00321 <span class="comment">//                              informer.inform(QString(&quot;Link creado: &quot;) + linkName);</span>
<a name="l00322"></a>00322             }
<a name="l00323"></a>00323 <span class="comment">//                      else</span>
<a name="l00324"></a>00324 <span class="comment">//                              informer.inform(QString(&quot;Se ha creado un link no registrado: &quot;) + linkName);</span>
<a name="l00325"></a>00325         }
<a name="l00326"></a>00326         <span class="keywordflow">break</span>;
<a name="l00327"></a>00327 
<a name="l00328"></a>00328     <span class="keywordflow">case</span> QVPropertyContainerChange::LinkDel:
<a name="l00329"></a>00329         {
<a name="l00330"></a>00330             uint fromId = change.getOrigId();
<a name="l00331"></a>00331             QString fromProp = change.getOrigProp();
<a name="l00332"></a>00332             uint toId = change.getDestId();
<a name="l00333"></a>00333             QString toProp = change.getDestProp();
<a name="l00334"></a>00334             QString linkName = getLinkName(change);
<a name="l00335"></a>00335             <span class="keywordflow">if</span> (createdLinks.contains(linkName))
<a name="l00336"></a>00336             {
<a name="l00337"></a>00337                 createdLinks.remove(linkName);
<a name="l00338"></a>00338                 slate.delLinkLine(fromId, fromProp, toId, toProp);
<a name="l00339"></a>00339                 <span class="comment">//std::cout &lt;&lt; change.toString().toStdString() &lt;&lt; std::endl;</span>
<a name="l00340"></a>00340             }
<a name="l00341"></a>00341         }
<a name="l00342"></a>00342         <span class="keywordflow">break</span>;
<a name="l00343"></a>00343 
<a name="l00344"></a>00344     <span class="keywordflow">case</span> QVPropertyContainerChange::All:
<a name="l00345"></a>00345         <span class="comment">//std::cout &lt;&lt; change.toString().toStdString() &lt;&lt; std::endl;</span>
<a name="l00346"></a>00346         <span class="keywordflow">break</span>;
<a name="l00347"></a>00347 
<a name="l00348"></a>00348     <span class="keywordflow">default</span>:
<a name="l00349"></a>00349         <span class="keywordflow">break</span>;
<a name="l00350"></a>00350     }
<a name="l00351"></a>00351 }
<a name="l00352"></a>00352 
<a name="l00353"></a>00353 <span class="comment">// esto se hace para que se almacenen los cambios antes de darle a run y que se hagan los read y writes</span>
<a name="l00354"></a>00354 <span class="keywordtype">void</span> QVDesignerGUI::dialogChange(QVPropertyContainerChange change)
<a name="l00355"></a>00355 {
<a name="l00356"></a>00356     <span class="keywordflow">switch</span> (change.getChangeType())
<a name="l00357"></a>00357     {
<a name="l00358"></a>00358         <span class="keywordflow">case</span> QVPropertyContainerChange::PropertyValue:
<a name="l00359"></a>00359         {
<a name="l00360"></a>00360             uint dialogId = change.getSourceId();
<a name="l00361"></a>00361             <span class="keywordflow">if</span> (dialogsToContainers.contains(dialogId))
<a name="l00362"></a>00362             {
<a name="l00363"></a>00363                 uint contId = dialogsToContainers.value(dialogId);
<a name="l00364"></a>00364                 QString prop = change.getPropName();
<a name="l00365"></a>00365                 propertyChanges.insert(getAbsPropName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(contId), prop), PropertyChange(contId, prop, change.getValue()));
<a name="l00366"></a>00366             }
<a name="l00367"></a>00367             <span class="keywordflow">break</span>;
<a name="l00368"></a>00368         }
<a name="l00369"></a>00369 
<a name="l00370"></a>00370         <span class="keywordflow">default</span>:
<a name="l00371"></a>00371             <span class="keywordflow">break</span>;
<a name="l00372"></a>00372     }
<a name="l00373"></a>00373 }
<a name="l00374"></a>00374 
<a name="l00375"></a>00375 <span class="keywordtype">void</span> QVDesignerGUI::showProperties(<span class="keyword">const</span> uint <span class="keywordtype">id</span>)
<a name="l00376"></a>00376 {
<a name="l00377"></a>00377     <span class="keywordflow">if</span> (containers.contains(<span class="keywordtype">id</span>)) {
<a name="l00378"></a>00378         <span class="keywordflow">if</span> (dialogs.contains(<span class="keywordtype">id</span>)) {
<a name="l00379"></a>00379             (dialogs.value(<span class="keywordtype">id</span>))-&gt;<a class="code" href="classQVGUI.html#aeda9d300364e3f709b6ba1aaf76efcd3" title="show the QVGUI object.">show</a>();
<a name="l00380"></a>00380         }
<a name="l00381"></a>00381         <span class="keywordflow">else</span> {
<a name="l00382"></a>00382             <span class="keywordflow">if</span> (createDialog(<span class="keywordtype">id</span>))
<a name="l00383"></a>00383                 (dialogs.value(<span class="keywordtype">id</span>))-&gt;<a class="code" href="classQVGUI.html#aeda9d300364e3f709b6ba1aaf76efcd3" title="show the QVGUI object.">show</a>();
<a name="l00384"></a>00384         }
<a name="l00385"></a>00385     }
<a name="l00386"></a>00386     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (initialContainers.contains(<span class="keywordtype">id</span>)) {
<a name="l00387"></a>00387         <span class="keywordflow">if</span> (dialogs.contains(<span class="keywordtype">id</span>)) {
<a name="l00388"></a>00388             (dialogs.value(<span class="keywordtype">id</span>))-&gt;<a class="code" href="classQVGUI.html#aeda9d300364e3f709b6ba1aaf76efcd3" title="show the QVGUI object.">show</a>();
<a name="l00389"></a>00389         }
<a name="l00390"></a>00390         <span class="keywordflow">else</span> {
<a name="l00391"></a>00391             <span class="keywordflow">if</span> (createDialog(<span class="keywordtype">id</span>))
<a name="l00392"></a>00392             (dialogs.value(<span class="keywordtype">id</span>))-&gt;<a class="code" href="classQVGUI.html#aeda9d300364e3f709b6ba1aaf76efcd3" title="show the QVGUI object.">show</a>();
<a name="l00393"></a>00393         }
<a name="l00394"></a>00394     }
<a name="l00395"></a>00395 }
<a name="l00396"></a>00396 
<a name="l00397"></a>00397 <span class="keywordtype">bool</span> QVDesignerGUI::createDialog(<span class="keyword">const</span> uint itemId)
<a name="l00398"></a>00398 {
<a name="l00399"></a>00399     <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *cont;
<a name="l00400"></a>00400     <span class="keywordflow">if</span> (containers.contains(itemId))
<a name="l00401"></a>00401         cont = containers.value(itemId);
<a name="l00402"></a>00402     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (initialContainers.contains(itemId))
<a name="l00403"></a>00403         cont = initialContainers.value(itemId);
<a name="l00404"></a>00404     <span class="keywordflow">else</span>
<a name="l00405"></a>00405         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00406"></a>00406 
<a name="l00407"></a>00407     <a class="code" href="classQVVideoReaderBlock.html" title="This is a generic video input processing block for the QVision architecture.">QVVideoReaderBlock</a> *cameraBlock;
<a name="l00408"></a>00408     <a class="code" href="classQVProcessingBlock.html" title="Base class for Block threads.">QVProcessingBlock</a>* block;
<a name="l00409"></a>00409     <span class="comment">//QVMPlayerCamera* camera;</span>
<a name="l00410"></a>00410     <a class="code" href="classQVImageCanvas.html" title="Display widget for QVImage objects and other data types.">QVImageCanvas</a>* imageCanvas;
<a name="l00411"></a>00411     <span class="keywordflow">if</span>((cameraBlock = dynamic_cast&lt;QVVideoReaderBlock*&gt;(cont)) != NULL) {
<a name="l00412"></a>00412         CameraBlockDialog *dialog = <span class="keyword">new</span> CameraBlockDialog(cameraBlock);
<a name="l00413"></a>00413         dialogs.insert(itemId, dialog);
<a name="l00414"></a>00414         dialogsToContainers.insert(dialog-&gt;getNodeId(), itemId);
<a name="l00415"></a>00415         connect(dialog-&gt;getInformer(), SIGNAL(changed(QVPropertyContainerChange)), <span class="keyword">this</span>, SLOT(dialogChange(QVPropertyContainerChange)));
<a name="l00416"></a>00416         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00417"></a>00417     }
<a name="l00418"></a>00418     <span class="keywordflow">else</span> <span class="keywordflow">if</span>((block = dynamic_cast&lt;QVProcessingBlock*&gt;(cont)) != NULL) {
<a name="l00419"></a>00419         BlockDialog *dialog = <span class="keyword">new</span> BlockDialog(block);
<a name="l00420"></a>00420         dialogs.insert(itemId, dialog);
<a name="l00421"></a>00421         dialogsToContainers.insert(dialog-&gt;getNodeId(), itemId);
<a name="l00422"></a>00422         connect(dialog-&gt;getInformer(), SIGNAL(changed(QVPropertyContainerChange)), <span class="keyword">this</span>, SLOT(dialogChange(QVPropertyContainerChange)));
<a name="l00423"></a>00423         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00424"></a>00424     }
<a name="l00426"></a>00426     <span class="comment">/*else if((camera = dynamic_cast&lt;QVMPlayerCamera*&gt;(cont)) != NULL) {</span>
<a name="l00427"></a>00427 <span class="comment">        CameraDialog * dialog = new CameraDialog(camera);</span>
<a name="l00428"></a>00428 <span class="comment">        dialogs.insert(itemId, dialog);</span>
<a name="l00429"></a>00429 <span class="comment">        dialogsToContainers.insert(dialog-&gt;getNodeId(), itemId);</span>
<a name="l00430"></a>00430 <span class="comment">        connect(dialog-&gt;getInformer(), SIGNAL(changed(QVPropertyContainerChange)), this, SLOT(dialogChange(QVPropertyContainerChange)));</span>
<a name="l00431"></a>00431 <span class="comment">        return true;</span>
<a name="l00432"></a>00432 <span class="comment">    }*/</span>
<a name="l00433"></a>00433     <span class="keywordflow">else</span> <span class="keywordflow">if</span>((imageCanvas = dynamic_cast&lt;QVImageCanvas*&gt;(cont)) != NULL) {
<a name="l00434"></a>00434         ImageCanvasDialog * dialog = <span class="keyword">new</span> ImageCanvasDialog(imageCanvas);
<a name="l00435"></a>00435         dialogs.insert(itemId, dialog);
<a name="l00436"></a>00436         dialogsToContainers.insert(dialog-&gt;getNodeId(), itemId);
<a name="l00437"></a>00437         connect(dialog-&gt;getInformer(), SIGNAL(changed(QVPropertyContainerChange)), <span class="keyword">this</span>, SLOT(dialogChange(QVPropertyContainerChange)));
<a name="l00438"></a>00438         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00439"></a>00439     }
<a name="l00440"></a>00440     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00441"></a>00441 }
<a name="l00442"></a>00442 
<a name="l00443"></a>00443 <span class="keywordtype">void</span> QVDesignerGUI::deleteDialog(<span class="keyword">const</span> uint itemId)
<a name="l00444"></a>00444 {
<a name="l00445"></a>00445     <span class="comment">// si se ha creado su dialogo, tambien lo borramos (puede no haberse creado si no se ha dado a run)</span>
<a name="l00446"></a>00446     <span class="keywordflow">if</span> (dialogs.contains(itemId)) {
<a name="l00447"></a>00447         <span class="keyword">delete</span> dialogs.value(itemId);
<a name="l00448"></a>00448         dialogs.remove(itemId);
<a name="l00449"></a>00449     }
<a name="l00450"></a>00450 }
<a name="l00451"></a>00451 
<a name="l00452"></a>00452 <span class="keywordtype">void</span> QVDesignerGUI::run()
<a name="l00453"></a>00453 {
<a name="l00454"></a>00454     <span class="comment">// creamos los dialogos que no se han creado aun, ya que después no se puede (porque no se puede lincar)</span>
<a name="l00455"></a>00455     <span class="keywordflow">foreach</span> (uint <span class="keywordtype">id</span>, containers.keys()) {
<a name="l00456"></a>00456         <span class="keywordflow">if</span> (!dialogs.contains(<span class="keywordtype">id</span>))
<a name="l00457"></a>00457             createDialog(<span class="keywordtype">id</span>);
<a name="l00458"></a>00458     }
<a name="l00459"></a>00459 
<a name="l00460"></a>00460     <span class="comment">// y arrancamos la simulación</span>
<a name="l00461"></a>00461     qvApp-&gt;startItems();
<a name="l00462"></a>00462 }
<a name="l00463"></a>00463 
<a name="l00464"></a>00464 <span class="keywordtype">void</span> QVDesignerGUI::stop()
<a name="l00465"></a>00465 {
<a name="l00466"></a>00466     <span class="comment">// guardando la descripción de lo que tenía creado</span>
<a name="l00467"></a>00467     QList&lt;CreatedItem&gt; lastItems = createdItems.values();
<a name="l00468"></a>00468     QList&lt;CreatedLink&gt; lastLinks = createdLinks.values();
<a name="l00469"></a>00469     QMap&lt;uint, uint&gt; oldId_To_NewId;
<a name="l00470"></a>00470     QList&lt;GroupInfo&gt; lastGroups =  slate.getGroups();
<a name="l00471"></a>00471 
<a name="l00472"></a>00472     <span class="comment">// detenemos la simulación (lo que desregistra los elementos del qvApp y deslinca los items)</span>
<a name="l00473"></a>00473     qvApp-&gt;quitItems();
<a name="l00474"></a>00474 
<a name="l00475"></a>00475     <span class="comment">// procesa todos los dellLink emitidos al parar los elementos desde el qvapp (para que no se solapen con su recontrucción)</span>
<a name="l00476"></a>00476     qApp-&gt;processEvents();
<a name="l00477"></a>00477 
<a name="l00478"></a>00478     <span class="comment">// oculto los objetos creados desde el main y borro sus dialogos, que se crean al arrancar</span>
<a name="l00479"></a>00479     <span class="keywordflow">foreach</span> (<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> * cont, initialContainers) {
<a name="l00480"></a>00480         uint <span class="keywordtype">id</span> = cont-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>();
<a name="l00481"></a>00481         slate.delItemNode(<span class="keywordtype">id</span>);
<a name="l00482"></a>00482         deleteDialog(<span class="keywordtype">id</span>);
<a name="l00483"></a>00483         createdItems.remove(<span class="keywordtype">id</span>);
<a name="l00484"></a>00484     }
<a name="l00485"></a>00485     initialContainers.clear(); <span class="comment">// solo hay que ocultar los elementos de entrada una vez (ya que esos objetos no se pueden eliminar desde este contexto)</span>
<a name="l00486"></a>00486 
<a name="l00487"></a>00487     <span class="comment">// borro los grupos creados</span>
<a name="l00488"></a>00488     slate.eraseGroups();
<a name="l00489"></a>00489 
<a name="l00490"></a>00490     <span class="comment">// borro los objetos creados</span>
<a name="l00491"></a>00491     <span class="keywordflow">foreach</span> (<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> * cont, containers) {
<a name="l00492"></a>00492         factory.deleteContainer(cont);
<a name="l00493"></a>00493     }
<a name="l00494"></a>00494     dialogsToContainers.clear();
<a name="l00495"></a>00495     createdLinks.clear();
<a name="l00496"></a>00496 
<a name="l00497"></a>00497     <span class="comment">// creo otros iguales (registrandose en la lista &quot;containers&quot;)</span>
<a name="l00498"></a>00498     <span class="keywordflow">foreach</span> (CreatedItem item, lastItems) {
<a name="l00499"></a>00499         uint newId = addItem(item.type, item.name, item.id);
<a name="l00500"></a>00500         oldId_To_NewId.insert(item.id, newId);
<a name="l00501"></a>00501         <span class="keywordflow">if</span> (newId == 0) std::cerr &lt;&lt; <span class="stringliteral">&quot;QVDesignerGUI - resetItems(): error al crear el Item &quot;</span> + item.name.toStdString() + <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00502"></a>00502     }
<a name="l00503"></a>00503 
<a name="l00504"></a>00504     <span class="comment">// creo links iguales a los que teniamos para los nuevos items (teniendo en cuenta el cambio de id que sufren)</span>
<a name="l00505"></a>00505     <span class="keywordflow">foreach</span> (CreatedLink link, lastLinks) {
<a name="l00506"></a>00506         <span class="keywordflow">if</span> (oldId_To_NewId.contains(link.fromId) &amp;&amp; (oldId_To_NewId.value(link.fromId) &gt; 0) &amp;&amp;
<a name="l00507"></a>00507             oldId_To_NewId.contains(link.toId)   &amp;&amp; (oldId_To_NewId.value(link.toId) &gt; 0) ) {
<a name="l00508"></a>00508             <span class="keywordflow">if</span> (!addLink(oldId_To_NewId.value(link.fromId), link.fromProp, oldId_To_NewId.value(link.toId), link.toProp, link.synchronous, link.sequential))
<a name="l00509"></a>00509                 std::cerr &lt;&lt; <span class="stringliteral">&quot;QVDesignerGUI - resetItems(): error al crear el Link &quot;</span> + QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(link.fromId).toStdString() + <span class="stringliteral">&quot; -&gt; &quot;</span> + QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(link.toId).toStdString() + <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00510"></a>00510         }
<a name="l00511"></a>00511     }
<a name="l00512"></a>00512 
<a name="l00513"></a>00513     <span class="comment">// restauro los valores cambiados por el usuario</span>
<a name="l00514"></a>00514     <span class="keywordflow">for</span> (QMap&lt;QString, PropertyChange&gt;::iterator it = propertyChanges.begin(); it != propertyChanges.end(); it++) { <span class="comment">// uso un iterador para poder modificar</span>
<a name="l00515"></a>00515         <span class="keywordflow">if</span> ( oldId_To_NewId.contains(it.value().id) &amp;&amp; (oldId_To_NewId.value(it.value().id) &gt; 0) ) {
<a name="l00516"></a>00516             it.value().id = oldId_To_NewId.value(it.value().id);  <span class="comment">// uso en id del nuevo item (que sustituye al anterior)</span>
<a name="l00517"></a>00517             <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *cont = containers.value(it.value().id);
<a name="l00518"></a>00518             QString prop = it.value().propName;
<a name="l00519"></a>00519             QVariant value = it.value().value;
<a name="l00520"></a>00520 
<a name="l00521"></a>00521             <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">int</span>&gt;(prop))
<a name="l00522"></a>00522                 cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<span class="keywordtype">int</span>&gt;(prop, value.value&lt;<span class="keywordtype">int</span>&gt;());
<a name="l00523"></a>00523             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">float</span>&gt;(prop))
<a name="l00524"></a>00524                 cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<span class="keywordtype">float</span>&gt;(prop, value.value&lt;<span class="keywordtype">float</span>&gt;());
<a name="l00525"></a>00525             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">bool</span>&gt;(prop))
<a name="l00526"></a>00526                 cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<span class="keywordtype">bool</span>&gt;(prop, value.value&lt;<span class="keywordtype">bool</span>&gt;());
<a name="l00527"></a>00527             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">double</span>&gt;(prop))
<a name="l00528"></a>00528                 cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<span class="keywordtype">double</span>&gt;(prop, value.value&lt;<span class="keywordtype">double</span>&gt;());
<a name="l00529"></a>00529             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;QString&gt;(prop))
<a name="l00530"></a>00530                 cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;QString&gt;(prop, value.value&lt;QString&gt;());
<a name="l00531"></a>00531             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<a class="code" href="classQVIndexedStringList.html" title="String List with a current string index.">QVIndexedStringList</a>&gt;(prop))
<a name="l00532"></a>00532                 cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<a class="code" href="classQVIndexedStringList.html" title="String List with a current string index.">QVIndexedStringList</a>&gt;(prop, value.value&lt;<a class="code" href="classQVIndexedStringList.html" title="String List with a current string index.">QVIndexedStringList</a>&gt;());
<a name="l00533"></a>00533             <span class="keywordflow">else</span>
<a name="l00534"></a>00534                 std::cerr &lt;&lt; <span class="stringliteral">&quot;QVDesignerGUI - resetItems(): error al restaurar valor: &quot;</span> + getAbsPropName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(it.value().id), it.value().propName).toStdString() + <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00535"></a>00535         }
<a name="l00536"></a>00536         <span class="keywordflow">else</span>
<a name="l00537"></a>00537             std::cerr &lt;&lt; <span class="stringliteral">&quot;QVDesignerGUI - resetItems(): error al restaurar valor: &quot;</span> + getAbsPropName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(it.value().id), it.value().propName).toStdString() + <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00538"></a>00538     }
<a name="l00539"></a>00539 
<a name="l00541"></a>00541     createGroups(lastGroups, oldId_To_NewId);
<a name="l00542"></a>00542 }
<a name="l00543"></a>00543 
<a name="l00544"></a>00544 <span class="keywordtype">void</span> QVDesignerGUI::createGroups(QList&lt;GroupInfo&gt; &amp;lastGroups, QMap&lt;uint, uint&gt; &amp;oldId_To_NewId) {
<a name="l00545"></a>00545     <span class="comment">// primero actualizo los Ids relativos a los nodos de todos los subgrupos, ya que han cambiado</span>
<a name="l00546"></a>00546 <span class="comment">//std::cout &lt;&lt; QString(&quot;lastGroups contiene:\n&quot;).toStdString();</span>
<a name="l00547"></a>00547     <span class="keywordflow">for</span> (QList&lt;GroupInfo&gt;::iterator it = lastGroups.begin(); it != lastGroups.end(); it++) {
<a name="l00548"></a>00548 <span class="comment">//std::cout &lt;&lt; QString(&quot;     %1\n&quot;).arg((*it).getId()).toStdString();</span>
<a name="l00549"></a>00549         <span class="comment">//std::cout &lt;&lt; &quot;para el info &quot; &lt;&lt; QString((*it).getName()).toStdString() &lt;&lt; &quot; hago los siguientes cambios de ID:\n&quot;;</span>
<a name="l00550"></a>00550         <span class="keywordflow">foreach</span> (uint oldId, (*it).getNodes()) {
<a name="l00551"></a>00551 <span class="comment">//std::cout &lt;&lt; QString(&quot;         que cnontiene a %1\n&quot;).arg(oldId).toStdString();</span>
<a name="l00552"></a>00552             <span class="comment">//std::cout &lt;&lt; QString(&quot;     cambio oldId = %1...&quot;).arg(oldId).toStdString();</span>
<a name="l00553"></a>00553             <span class="keywordflow">if</span> (oldId_To_NewId.contains(oldId)) {
<a name="l00554"></a>00554                 (*it).updateNodeId(oldId, oldId_To_NewId.value(oldId));
<a name="l00555"></a>00555                 <span class="comment">//std::cout &lt;&lt; QString(&quot; a newId = %1&quot;).arg(oldId_To_NewId.value(oldId)).toStdString();</span>
<a name="l00556"></a>00556             }
<a name="l00557"></a>00557             <span class="comment">//std::cout &lt;&lt; &quot;\n&quot;;</span>
<a name="l00558"></a>00558         }
<a name="l00559"></a>00559     }
<a name="l00560"></a>00560     <span class="comment">// Voy creando los nuevos grupos por pasadas (para que cree primero los subgrupos), y a la misma vez se van actualizando los IDs de los subgrupos de los restantes</span>
<a name="l00561"></a>00561     <span class="keywordtype">bool</span> reloop = <span class="keyword">true</span>;
<a name="l00562"></a>00562     <span class="keywordflow">while</span> (reloop) { <span class="comment">// bucle por pasadas, intenta crear los grupos restantes, hasta que en una pasada no se cree ninguno</span>
<a name="l00563"></a>00563         <span class="comment">//std::cout &lt;&lt; &quot;Una pasada: \n&quot;;</span>
<a name="l00564"></a>00564         QMap&lt;uint, uint&gt; changes;
<a name="l00565"></a>00565         QList&lt;GroupInfo&gt;::iterator it = lastGroups.begin();
<a name="l00566"></a>00566         <span class="keywordflow">while</span> (it != lastGroups.end()) { <span class="comment">// intento crear los grupos y guardo el cambio de ID</span>
<a name="l00567"></a>00567             uint oldId = (*it).getId();
<a name="l00568"></a>00568 <span class="comment">//std::cout &lt;&lt; QString(&quot;intento crear el grupo %1... &quot;).arg(oldId).toStdString();</span>
<a name="l00569"></a>00569             uint newId = slate.createGroup(*it);
<a name="l00570"></a>00570 <span class="comment">//std::cout &lt;&lt; QString(&quot;como %1\n&quot;).arg(newId).toStdString();</span>
<a name="l00571"></a>00571             <span class="comment">//std::cout &lt;&lt; QString(&quot;Encuentro un info, oldId = %1, newId = %2...&quot;).arg(oldId).arg(newId).toStdString();</span>
<a name="l00572"></a>00572             <span class="keywordflow">if</span> (newId &gt; 0) {
<a name="l00573"></a>00573                 changes.insert(oldId, newId);
<a name="l00574"></a>00574                 it = lastGroups.erase(it);<span class="comment">// borro el elemento cambiado de la lista (lo que avanza la lista), ya se ha creado su grupo</span>
<a name="l00575"></a>00575                 <span class="comment">//std::cout &lt;&lt; &quot; por lo que inserto un cambio&quot;;</span>
<a name="l00576"></a>00576             }
<a name="l00577"></a>00577             <span class="keywordflow">else</span> it++;
<a name="l00578"></a>00578             <span class="comment">//std::cout &lt;&lt; &quot;\n&quot;;</span>
<a name="l00579"></a>00579         }
<a name="l00580"></a>00580         <span class="keywordflow">foreach</span> (uint idChanged, changes.keys()) { <span class="comment">// actualizo los cambios en el resto</span>
<a name="l00581"></a>00581             <span class="keywordflow">for</span> (QList&lt;GroupInfo&gt;::iterator it = lastGroups.begin(); it != lastGroups.end(); it++)
<a name="l00582"></a>00582                 <span class="keywordflow">foreach</span> (uint oldId, (*it).getSubgroups())
<a name="l00583"></a>00583                     <span class="keywordflow">if</span> (oldId == idChanged)
<a name="l00584"></a>00584                         (*it).updateSubgroupId(idChanged, changes.value(idChanged));
<a name="l00585"></a>00585         }
<a name="l00586"></a>00586         reloop = !changes.isEmpty();
<a name="l00587"></a>00587     }
<a name="l00588"></a>00588 }
<a name="l00589"></a>00589 
<a name="l00590"></a>00590 <span class="keywordtype">void</span> QVDesignerGUI::quit()
<a name="l00591"></a>00591 {
<a name="l00592"></a>00592     qvApp-&gt;deregisterGUI();
<a name="l00593"></a>00593     qvApp-&gt;quit();
<a name="l00594"></a>00594 }
<a name="l00595"></a>00595 
<a name="l00596"></a>00596 
<a name="l00597"></a>00597 
<a name="l00598"></a>00598 
<a name="l00599"></a>00599 
<a name="l00600"></a>00600 
<a name="l00601"></a>00601 
<a name="l00602"></a>00602 
<a name="l00603"></a>00603 
<a name="l00607"></a>00607 
<a name="l00608"></a>00608 
<a name="l00609"></a>00609 QString QVDesignerGUI::getCppText()<span class="keyword"> const</span>
<a name="l00610"></a>00610 <span class="keyword"></span>{
<a name="l00611"></a>00611     QString result;
<a name="l00612"></a>00612 
<a name="l00613"></a>00613     <span class="comment">// incluye una cabezera inicial con el copyright de la librería QVision</span>
<a name="l00614"></a>00614     result += <span class="stringliteral">&quot;/*\n *   Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012. PARP Research Group.\n *      &lt;http://perception.inf.um.es&gt;\n *       University of Murcia, Spain.\n *\n *    This file is part of the QVision library.\n *\n *       QVision is free software: you can redistribute it and/or modify\n *     it under the terms of the GNU Lesser General Public License as\n *      published by the Free Software Foundation, version 3 of the License.\n *\n *    QVision is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *       GNU Lesser General Public License for more details.\n *\n *     You should have received a copy of the GNU Lesser General Public\n *    License along with QVision. If not, see &lt;http://www.gnu.org/licenses/&gt;.\n */\n\n&quot;</span>;
<a name="l00615"></a>00615 
<a name="l00616"></a>00616     <span class="comment">// genera la lista de includes, si alguno de los elementos ha sido definido por el usuario, lo declara para que el usuario lo referencie</span>
<a name="l00617"></a>00617     result += <span class="stringliteral">&quot;#include &lt;QVApplication&gt;\n#include &lt;QVDefaultGUI&gt;\n&quot;</span>;
<a name="l00618"></a>00618     QList&lt;QString&gt; types;
<a name="l00619"></a>00619     <span class="keywordflow">foreach</span>(CreatedItem item, createdItems.values()) {
<a name="l00620"></a>00620         QString chopType = item.type;
<a name="l00621"></a>00621         <span class="keywordtype">int</span> espInd = chopType.indexOf(<span class="charliteral">&#39; &#39;</span>);
<a name="l00622"></a>00622         <span class="keywordtype">int</span> lesInd = chopType.indexOf(<span class="charliteral">&#39;&lt;&#39;</span>);
<a name="l00623"></a>00623         <span class="keywordflow">if</span> ((espInd &gt; 0) &amp;&amp; (espInd &lt; lesInd))
<a name="l00624"></a>00624             types.append(chopType.left(espInd));
<a name="l00625"></a>00625         <span class="keywordflow">else</span>
<a name="l00626"></a>00626             types.append(chopType.left(lesInd));
<a name="l00627"></a>00627     }
<a name="l00628"></a>00628     QSet&lt;QString&gt; unrepeatedTypes = types.toSet();
<a name="l00629"></a>00629     <span class="keywordflow">foreach</span>(QString unrepType, unrepeatedTypes) {
<a name="l00630"></a>00630         <span class="keywordflow">if</span> (factory.isUserType(unrepType))
<a name="l00631"></a>00631             result += QString(<span class="stringliteral">&quot;class &quot;</span>) + unrepType + QString(<span class="stringliteral">&quot;;\n&quot;</span>);
<a name="l00632"></a>00632         <span class="keywordflow">else</span>
<a name="l00633"></a>00633             result += QString(<span class="stringliteral">&quot;#include &lt;&quot;</span>) + unrepType + QString(<span class="stringliteral">&quot;&gt;\n&quot;</span>);
<a name="l00634"></a>00634     }
<a name="l00635"></a>00635     <span class="comment">// si en alguno de los items se ha modificado una propiedad QVIndexedStringList, se añade su include</span>
<a name="l00636"></a>00636     <span class="keywordtype">bool</span> QVISLadded = FALSE;
<a name="l00637"></a>00637     <span class="keywordflow">foreach</span>(CreatedItem item, createdItems.values()) {
<a name="l00638"></a>00638         <span class="keywordflow">foreach</span>(PropertyChange change, propertyChanges.values()) {
<a name="l00639"></a>00639             <span class="keywordflow">if</span> ( (change.id == item.id) &amp;&amp; (containers.value(item.id)-&gt;isType&lt;<a class="code" href="classQVIndexedStringList.html" title="String List with a current string index.">QVIndexedStringList</a>&gt;(change.propName)) ) {
<a name="l00640"></a>00640                 result += QString(<span class="stringliteral">&quot;#include &lt;QVIndexedStringList&gt;\n&quot;</span>);
<a name="l00641"></a>00641                 QVISLadded = TRUE;
<a name="l00642"></a>00642                 <span class="keywordflow">break</span>;
<a name="l00643"></a>00643             }
<a name="l00644"></a>00644         }
<a name="l00645"></a>00645         <span class="keywordflow">if</span> (QVISLadded) <span class="keywordflow">break</span>;
<a name="l00646"></a>00646     }
<a name="l00647"></a>00647 
<a name="l00648"></a>00648     <span class="comment">// comienza el método main</span>
<a name="l00649"></a>00649     result += <span class="stringliteral">&quot;\n#ifndef DOXYGEN_IGNORE_THIS\n\n&quot;</span>;
<a name="l00650"></a>00650     result += <span class="stringliteral">&quot;int main(int argc, char *argv[])\n       {\n     QVApplication app(argc, argv, \&quot;Example program for QVision library.\&quot;);\n\n&quot;</span>;
<a name="l00651"></a>00651 
<a name="l00652"></a>00652     <span class="comment">// contruye los objetos usados</span>
<a name="l00653"></a>00653     <span class="keywordflow">foreach</span>(CreatedItem item, createdItems.values()) {
<a name="l00654"></a>00654         result += QString(<span class="stringliteral">&quot;     &quot;</span>) + item.type + QString(<span class="stringliteral">&quot; &quot;</span>) + item.name + QString(<span class="stringliteral">&quot;(\&quot;&quot;</span>) + item.name + QString(<span class="stringliteral">&quot;\&quot;);\n&quot;</span>);
<a name="l00655"></a>00655     }
<a name="l00656"></a>00656     result += <span class="stringliteral">&quot;\n       QVDefaultGUI interface;\n\n&quot;</span>;
<a name="l00657"></a>00657 
<a name="l00658"></a>00658     <span class="comment">// realiza los links</span>
<a name="l00659"></a>00659     <span class="keywordflow">foreach</span>(CreatedLink link, createdLinks.values()) {
<a name="l00660"></a>00660         <span class="keywordflow">if</span> (containers.contains(link.fromId) &amp;&amp; containers.contains(link.toId)) {
<a name="l00661"></a>00661             <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *fromCont = containers.value(link.fromId);
<a name="l00662"></a>00662             <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *toCont = containers.value(link.toId);
<a name="l00663"></a>00663 
<a name="l00664"></a>00664             <span class="comment">//QVMPlayerCamera* camera;</span>
<a name="l00665"></a>00665             <a class="code" href="classQVProcessingBlock.html" title="Base class for Block threads.">QVProcessingBlock</a>* block;
<a name="l00666"></a>00666             <a class="code" href="classQVProcessingBlock.html" title="Base class for Block threads.">QVProcessingBlock</a>* block2;
<a name="l00667"></a>00667             <a class="code" href="classQVImageCanvas.html" title="Display widget for QVImage objects and other data types.">QVImageCanvas</a>* canvas;
<a name="l00668"></a>00668             <a class="code" href="classQVPlot.html" title="Class for plot block&amp;#39;s graphs.">QVPlot</a>* plot;
<a name="l00669"></a>00669 
<a name="l00671"></a>00671             <span class="comment">/*if((camera = dynamic_cast&lt;QVMPlayerCamera*&gt;(fromCont)) != NULL) {</span>
<a name="l00672"></a>00672 <span class="comment">                if((block = dynamic_cast&lt;QVProcessingBlock*&gt;(toCont)) != NULL) {</span>
<a name="l00673"></a>00673 <span class="comment">                    result += QString(&quot; &quot;) + fromCont-&gt;getName() + QString(&quot;.link(&amp;&quot;) + toCont-&gt;getName() + QString(&quot;, \&quot;&quot;) + link.toProp + QString(&quot;\&quot;);\n&quot;);</span>
<a name="l00674"></a>00674 <span class="comment">                }</span>
<a name="l00675"></a>00675 <span class="comment">            }</span>
<a name="l00676"></a>00676 <span class="comment">            else*/</span> <span class="keywordflow">if</span>((block = dynamic_cast&lt;QVProcessingBlock*&gt;(fromCont)) != NULL) {
<a name="l00677"></a>00677                 <span class="keywordflow">if</span>((block2 = dynamic_cast&lt;QVProcessingBlock*&gt;(toCont)) != NULL) {
<a name="l00678"></a>00678                     result += QString(<span class="stringliteral">&quot; &quot;</span>) + fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#a82e880a6c160f3780bc8f7b822fbbd85" title="Retrieves identifier QString of the object.">getName</a>() + QString(<span class="stringliteral">&quot;.linkProperty(\&quot;&quot;</span>) + link.fromProp + QString(<span class="stringliteral">&quot;\&quot;, &amp;&quot;</span>);
<a name="l00679"></a>00679                     result += toCont-&gt;<a class="code" href="classQVPropertyContainer.html#a82e880a6c160f3780bc8f7b822fbbd85" title="Retrieves identifier QString of the object.">getName</a>() + QString(<span class="stringliteral">&quot;, \&quot;&quot;</span>) + link.toProp;
<a name="l00680"></a>00680                     <span class="keywordflow">if</span> (link.synchronous)
<a name="l00681"></a>00681                         result += QString(<span class="stringliteral">&quot;\&quot;, QVProcessingBlock::SynchronousLink);\n&quot;</span>);
<a name="l00682"></a>00682                     <span class="keywordflow">else</span>
<a name="l00683"></a>00683                         result += QString(<span class="stringliteral">&quot;\&quot;, QVProcessingBlock::AsynchronousLink);\n&quot;</span>);
<a name="l00684"></a>00684                 }
<a name="l00685"></a>00685                 <span class="keywordflow">else</span> <span class="keywordflow">if</span>((canvas = dynamic_cast&lt;QVImageCanvas*&gt;(toCont)) != NULL) {
<a name="l00686"></a>00686                     result += QString(<span class="stringliteral">&quot; &quot;</span>) + toCont-&gt;<a class="code" href="classQVPropertyContainer.html#a82e880a6c160f3780bc8f7b822fbbd85" title="Retrieves identifier QString of the object.">getName</a>() + QString(<span class="stringliteral">&quot;.linkProperty(&quot;</span>) + fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#a82e880a6c160f3780bc8f7b822fbbd85" title="Retrieves identifier QString of the object.">getName</a>() + QString(<span class="stringliteral">&quot;, \&quot;&quot;</span>) + link.fromProp + QString(<span class="stringliteral">&quot;\&quot;);\n&quot;</span>);
<a name="l00687"></a>00687                 }
<a name="l00688"></a>00688                 <span class="keywordflow">else</span> <span class="keywordflow">if</span>((plot = dynamic_cast&lt;QVPlot*&gt;(toCont)) != NULL) {
<a name="l00689"></a>00689                     result += QString(<span class="stringliteral">&quot; &quot;</span>) + toCont-&gt;<a class="code" href="classQVPropertyContainer.html#a82e880a6c160f3780bc8f7b822fbbd85" title="Retrieves identifier QString of the object.">getName</a>() + QString(<span class="stringliteral">&quot;.linkProperty(&quot;</span>) + fromCont-&gt;<a class="code" href="classQVPropertyContainer.html#a82e880a6c160f3780bc8f7b822fbbd85" title="Retrieves identifier QString of the object.">getName</a>() + QString(<span class="stringliteral">&quot;, \&quot;&quot;</span>) + link.fromProp + QString(<span class="stringliteral">&quot;\&quot;);\n&quot;</span>);
<a name="l00690"></a>00690                 }
<a name="l00691"></a>00691             }
<a name="l00692"></a>00692         }
<a name="l00693"></a>00693     }
<a name="l00694"></a>00694 
<a name="l00695"></a>00695     <span class="comment">// establece los valores actuales de las propiedades</span>
<a name="l00696"></a>00696     result += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00697"></a>00697     <span class="keywordflow">foreach</span>(CreatedItem item, createdItems.values()) {
<a name="l00698"></a>00698         <span class="keywordflow">foreach</span>(PropertyChange change, propertyChanges.values()) {
<a name="l00699"></a>00699             <span class="keywordflow">if</span> (change.id == item.id) {
<a name="l00700"></a>00700                 <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *cont = containers.value(item.id);
<a name="l00701"></a>00701                 QString prop = change.propName;
<a name="l00702"></a>00702                 QVariant value = change.value;
<a name="l00703"></a>00703 
<a name="l00704"></a>00704                 <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">int</span>&gt;(prop))
<a name="l00705"></a>00705                     result += QString(<span class="stringliteral">&quot; &quot;</span>) + item.name + <span class="stringliteral">&quot;.setPropertyValue&lt;int&gt;(\&quot;&quot;</span> + prop + <span class="stringliteral">&quot;\&quot;, &quot;</span> + value.toString() + <span class="stringliteral">&quot;);\n&quot;</span>;
<a name="l00706"></a>00706                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">bool</span>&gt;(prop))
<a name="l00707"></a>00707                     result += QString(<span class="stringliteral">&quot; &quot;</span>) + item.name + <span class="stringliteral">&quot;.setPropertyValue&lt;bool&gt;(\&quot;&quot;</span> + prop + <span class="stringliteral">&quot;\&quot;, &quot;</span> + value.toString() + <span class="stringliteral">&quot;);\n&quot;</span>;
<a name="l00708"></a>00708                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">double</span>&gt;(prop))
<a name="l00709"></a>00709                     result += QString(<span class="stringliteral">&quot; &quot;</span>) + item.name + <span class="stringliteral">&quot;.setPropertyValue&lt;double&gt;(\&quot;&quot;</span> + prop + <span class="stringliteral">&quot;\&quot;, &quot;</span> + value.toString() + <span class="stringliteral">&quot;);\n&quot;</span>;
<a name="l00710"></a>00710                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;QString&gt;(prop))
<a name="l00711"></a>00711                     result += QString(<span class="stringliteral">&quot; &quot;</span>) + item.name + <span class="stringliteral">&quot;.setPropertyValue&lt;QString&gt;(\&quot;&quot;</span> + prop + <span class="stringliteral">&quot;\&quot;, &quot;</span> + value.toString() + <span class="stringliteral">&quot;);\n&quot;</span>;
<a name="l00712"></a>00712                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<a class="code" href="classQVIndexedStringList.html" title="String List with a current string index.">QVIndexedStringList</a>&gt;(prop)) {
<a name="l00713"></a>00713                     <a class="code" href="classQVIndexedStringList.html" title="String List with a current string index.">QVIndexedStringList</a> indlist = value.value&lt;<a class="code" href="classQVIndexedStringList.html" title="String List with a current string index.">QVIndexedStringList</a>&gt;();
<a name="l00714"></a>00714                     result += QString(<span class="stringliteral">&quot; QVIndexedStringList &quot;</span>) + <span class="stringliteral">&quot;QVISLfor_&quot;</span> + item.name + <span class="stringliteral">&quot;;\n&quot;</span>;
<a name="l00715"></a>00715                     <span class="keywordflow">foreach</span> (QString option, indlist) {
<a name="l00716"></a>00716                         result += QString(<span class="stringliteral">&quot;     QVISLfor_&quot;</span>) + item.name + <span class="stringliteral">&quot;.append(\&quot;&quot;</span> + option + <span class="stringliteral">&quot;\&quot;);\n&quot;</span>;
<a name="l00717"></a>00717                     }
<a name="l00718"></a>00718                     result += QString(<span class="stringliteral">&quot; QVISLfor_&quot;</span>) + item.name + QString(<span class="stringliteral">&quot;.setIndex(%1);\n&quot;</span>).arg(indlist.<a class="code" href="classQVIndexedStringList.html#a9855746cb07868930d17476bab48f251" title="Return the index.">getIndex</a>());
<a name="l00719"></a>00719                     result += QString(<span class="stringliteral">&quot; &quot;</span>) + item.name + <span class="stringliteral">&quot;.setPropertyValue&lt;QVIndexedStringList&gt;(\&quot;&quot;</span> + prop + <span class="stringliteral">&quot;\&quot;, QVISLfor_&quot;</span> + item.name + <span class="stringliteral">&quot;);\n&quot;</span>;
<a name="l00720"></a>00720                 }
<a name="l00721"></a>00721             }
<a name="l00722"></a>00722         }
<a name="l00723"></a>00723     }
<a name="l00724"></a>00724 
<a name="l00725"></a>00725     <span class="comment">// finaliza el fichero</span>
<a name="l00726"></a>00726     result += <span class="stringliteral">&quot;\n       return app.exec();\n    }\n\n#endif\n\n&quot;</span>;
<a name="l00727"></a>00727     <span class="keywordflow">return</span> result;
<a name="l00728"></a>00728 }
<a name="l00729"></a>00729 
<a name="l00730"></a>00730 QString QVDesignerGUI::getXMLText()
<a name="l00731"></a>00731 {
<a name="l00732"></a>00732     QString text;
<a name="l00733"></a>00733     QXmlStreamWriter xmlWriter(&amp;text);
<a name="l00734"></a>00734     xmlWriter.setAutoFormatting(<span class="keyword">true</span>);
<a name="l00735"></a>00735     uint xmlId = 1;
<a name="l00736"></a>00736     QMap&lt;uint, uint&gt; ItemId_To_xmlId;
<a name="l00737"></a>00737 
<a name="l00738"></a>00738     xmlWriter.writeStartDocument(<span class="stringliteral">&quot;1.0&quot;</span>);
<a name="l00739"></a>00739     xmlWriter.writeStartElement(<span class="stringliteral">&quot;QVApplication&quot;</span>);
<a name="l00740"></a>00740 
<a name="l00741"></a>00741     <span class="comment">// añade las características de los items</span>
<a name="l00742"></a>00742     xmlWriter.writeStartElement(<span class="stringliteral">&quot;Nodes&quot;</span>);
<a name="l00743"></a>00743     <span class="keywordflow">foreach</span>(CreatedItem item, createdItems.values()) {
<a name="l00744"></a>00744         xmlWriter.writeStartElement(<span class="stringliteral">&quot;Node&quot;</span>);
<a name="l00745"></a>00745         xmlWriter.writeAttribute(<span class="stringliteral">&quot;Type&quot;</span>, item.type);
<a name="l00746"></a>00746         xmlWriter.writeAttribute(<span class="stringliteral">&quot;Id&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(xmlId));
<a name="l00747"></a>00747         ItemId_To_xmlId.insert(item.id, xmlId++);
<a name="l00748"></a>00748         xmlWriter.writeAttribute(<span class="stringliteral">&quot;Name&quot;</span>, item.name);
<a name="l00749"></a>00749         QPointF pos = slate.getNodePos(item.id);
<a name="l00750"></a>00750         xmlWriter.writeAttribute(<span class="stringliteral">&quot;X&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(pos.x()));
<a name="l00751"></a>00751         xmlWriter.writeAttribute(<span class="stringliteral">&quot;Y&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(pos.y()));
<a name="l00752"></a>00752 
<a name="l00753"></a>00753         <span class="comment">// añade las características de los cambios en las  propiedades de cada item</span>
<a name="l00754"></a>00754         <span class="keywordflow">foreach</span>(PropertyChange change, propertyChanges.values()) {
<a name="l00755"></a>00755             <span class="keywordflow">if</span> (change.id == item.id) {
<a name="l00756"></a>00756                 QString strValue = change.value.toString();
<a name="l00757"></a>00757                 <span class="keywordflow">if</span> (!strValue.isEmpty()) {
<a name="l00758"></a>00758                     xmlWriter.writeStartElement(<span class="stringliteral">&quot;Property&quot;</span>);
<a name="l00759"></a>00759                     xmlWriter.writeAttribute(<span class="stringliteral">&quot;Name&quot;</span>, change.propName);
<a name="l00760"></a>00760                     xmlWriter.writeAttribute(<span class="stringliteral">&quot;Value&quot;</span>, strValue);
<a name="l00761"></a>00761                     xmlWriter.writeEndElement();
<a name="l00762"></a>00762                 }
<a name="l00763"></a>00763             }
<a name="l00764"></a>00764         }
<a name="l00765"></a>00765         xmlWriter.writeEndElement();
<a name="l00766"></a>00766     }
<a name="l00767"></a>00767     xmlWriter.writeEndElement();
<a name="l00768"></a>00768 
<a name="l00769"></a>00769     <span class="comment">// añade las características de los links</span>
<a name="l00770"></a>00770     xmlWriter.writeStartElement(<span class="stringliteral">&quot;Links&quot;</span>);
<a name="l00771"></a>00771     <span class="keywordflow">foreach</span> (CreatedLink link, createdLinks.values()) {
<a name="l00772"></a>00772         <span class="keywordflow">if</span> ( (containers.contains(link.fromId) &amp;&amp; containers.contains(link.toId)) ||
<a name="l00773"></a>00773               (initialContainers.contains(link.fromId) &amp;&amp; initialContainers.contains(link.toId)) ) { <span class="comment">// igual tendría que no registrar a los paramInspector al init</span>
<a name="l00774"></a>00774             <span class="keywordflow">if</span> (link.synchronous)               xmlWriter.writeStartElement(<span class="stringliteral">&quot;SynchronousLink&quot;</span>);
<a name="l00775"></a>00775             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (link.sequential)   xmlWriter.writeStartElement(<span class="stringliteral">&quot;SequentialLink&quot;</span>);
<a name="l00776"></a>00776             <span class="keywordflow">else</span>                                                xmlWriter.writeStartElement(<span class="stringliteral">&quot;AsynchronousLink&quot;</span>);
<a name="l00777"></a>00777             xmlWriter.writeAttribute(<span class="stringliteral">&quot;FromId&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(ItemId_To_xmlId.value(link.fromId)));
<a name="l00778"></a>00778             xmlWriter.writeAttribute(<span class="stringliteral">&quot;FromProp&quot;</span>, link.fromProp);
<a name="l00779"></a>00779             xmlWriter.writeAttribute(<span class="stringliteral">&quot;ToId&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(ItemId_To_xmlId.value(link.toId)));
<a name="l00780"></a>00780             xmlWriter.writeAttribute(<span class="stringliteral">&quot;ToProp&quot;</span>, link.toProp);
<a name="l00781"></a>00781             xmlWriter.writeEndElement();
<a name="l00782"></a>00782         }
<a name="l00783"></a>00783     }
<a name="l00784"></a>00784     xmlWriter.writeEndElement();
<a name="l00785"></a>00785 
<a name="l00786"></a>00786     <span class="comment">// añade las características de los grupos credos en la pizarra</span>
<a name="l00787"></a>00787     xmlWriter.writeStartElement(<span class="stringliteral">&quot;Groups&quot;</span>);
<a name="l00788"></a>00788     QList&lt;GroupInfo&gt; groupList = slate.getGroups();
<a name="l00789"></a>00789     <span class="keywordflow">foreach</span> (GroupInfo group, groupList) {
<a name="l00790"></a>00790         xmlWriter.writeStartElement(<span class="stringliteral">&quot;Group&quot;</span>);
<a name="l00791"></a>00791         xmlWriter.writeAttribute(<span class="stringliteral">&quot;Id&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(group.getId()));
<a name="l00792"></a>00792         xmlWriter.writeAttribute(<span class="stringliteral">&quot;Name&quot;</span>, group.getName());
<a name="l00793"></a>00793         QPointF pos =group.getPos();
<a name="l00794"></a>00794         xmlWriter.writeAttribute(<span class="stringliteral">&quot;X&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(pos.x()));
<a name="l00795"></a>00795         xmlWriter.writeAttribute(<span class="stringliteral">&quot;Y&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(pos.y()));
<a name="l00796"></a>00796         <span class="keywordflow">foreach</span> (uint nodeId, group.getNodes()) {
<a name="l00797"></a>00797             xmlWriter.writeStartElement(<span class="stringliteral">&quot;ChildNode&quot;</span>);
<a name="l00798"></a>00798             xmlWriter.writeAttribute(<span class="stringliteral">&quot;Id&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(ItemId_To_xmlId.value(nodeId)));
<a name="l00799"></a>00799             xmlWriter.writeEndElement();
<a name="l00800"></a>00800         }
<a name="l00801"></a>00801         <span class="keywordflow">foreach</span> (uint subId, group.getSubgroups()) {
<a name="l00802"></a>00802             xmlWriter.writeStartElement(<span class="stringliteral">&quot;ChildGroup&quot;</span>);
<a name="l00803"></a>00803             xmlWriter.writeAttribute(<span class="stringliteral">&quot;Id&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(subId));
<a name="l00804"></a>00804             xmlWriter.writeEndElement();
<a name="l00805"></a>00805         }
<a name="l00806"></a>00806         <span class="keywordflow">foreach</span> (LinkInfo link, group.getNodeLinks()) {
<a name="l00807"></a>00807             xmlWriter.writeStartElement(<span class="stringliteral">&quot;VisibleNodeLink&quot;</span>);
<a name="l00808"></a>00808             xmlWriter.writeAttribute(<span class="stringliteral">&quot;ChildNode&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(ItemId_To_xmlId.value(link.getNode())));
<a name="l00809"></a>00809             xmlWriter.writeAttribute(<span class="stringliteral">&quot;Prop&quot;</span>, link.getProp());
<a name="l00810"></a>00810             xmlWriter.writeAttribute(<span class="stringliteral">&quot;Direction&quot;</span>, link.getInput() ? <span class="stringliteral">&quot;Input&quot;</span> : <span class="stringliteral">&quot;Output&quot;</span>);
<a name="l00811"></a>00811             xmlWriter.writeEndElement();
<a name="l00812"></a>00812         }
<a name="l00813"></a>00813         <span class="keywordflow">foreach</span> (LinkInfo link, group.getSubgroupLinks()) {
<a name="l00814"></a>00814             xmlWriter.writeStartElement(<span class="stringliteral">&quot;VisibleGroupLink&quot;</span>);
<a name="l00815"></a>00815             xmlWriter.writeAttribute(<span class="stringliteral">&quot;ChildGroup&quot;</span>, QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(link.getNode()));
<a name="l00816"></a>00816             xmlWriter.writeAttribute(<span class="stringliteral">&quot;Prop&quot;</span>, link.getProp());
<a name="l00817"></a>00817             xmlWriter.writeAttribute(<span class="stringliteral">&quot;Direction&quot;</span>, link.getInput() ? <span class="stringliteral">&quot;Input&quot;</span> : <span class="stringliteral">&quot;Output&quot;</span>);
<a name="l00818"></a>00818             xmlWriter.writeEndElement();
<a name="l00819"></a>00819         }
<a name="l00820"></a>00820         xmlWriter.writeEndElement();
<a name="l00821"></a>00821     }
<a name="l00822"></a>00822     xmlWriter.writeEndElement();
<a name="l00823"></a>00823 
<a name="l00824"></a>00824     xmlWriter.writeEndElement();
<a name="l00825"></a>00825     xmlWriter.writeEndDocument();
<a name="l00826"></a>00826 
<a name="l00827"></a>00827     <span class="keywordflow">return</span> text;
<a name="l00828"></a>00828 }
<a name="l00829"></a>00829 
<a name="l00830"></a>00830 <span class="keywordtype">bool</span> QVDesignerGUI::loadXML(QString text)
<a name="l00831"></a>00831 {
<a name="l00832"></a>00832     <span class="comment">// borra todo lo que hay</span>
<a name="l00833"></a>00833     slate.eraseGroups();
<a name="l00834"></a>00834     createdLinks.clear();
<a name="l00835"></a>00835 
<a name="l00836"></a>00836     <span class="keywordflow">foreach</span> (<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> * cont, containers) {
<a name="l00837"></a>00837         factory.deleteContainer(cont);
<a name="l00838"></a>00838     }
<a name="l00839"></a>00839 
<a name="l00840"></a>00840     propertyChanges.clear();
<a name="l00841"></a>00841     dialogsToContainers.clear();
<a name="l00842"></a>00842 
<a name="l00843"></a>00843 
<a name="l00844"></a>00844 
<a name="l00845"></a>00845 
<a name="l00846"></a>00846     <span class="comment">// carga lo del fichero</span>
<a name="l00847"></a>00847     QXmlStreamReader xmlReader(text);
<a name="l00848"></a>00848 
<a name="l00849"></a>00849     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l00850"></a>00850         xmlReader.readNext();
<a name="l00851"></a>00851 
<a name="l00852"></a>00852         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l00853"></a>00853             <span class="keywordflow">break</span>;
<a name="l00854"></a>00854 
<a name="l00855"></a>00855         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l00856"></a>00856             <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;QVApplication&quot;</span>)
<a name="l00857"></a>00857                 readXMLQVApplication(xmlReader);
<a name="l00858"></a>00858             <span class="keywordflow">else</span>
<a name="l00859"></a>00859                 readXMLUnknownElement(xmlReader);
<a name="l00860"></a>00860         }
<a name="l00861"></a>00861     }
<a name="l00862"></a>00862 
<a name="l00863"></a>00863     XMLId_To_ContainersId.clear(); <span class="comment">// se resetea para la siguiente llamada</span>
<a name="l00864"></a>00864 
<a name="l00865"></a>00865     <span class="keywordflow">if</span> (xmlReader.hasError()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00866"></a>00866 
<a name="l00867"></a>00867     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00868"></a>00868 }
<a name="l00869"></a>00869 
<a name="l00870"></a>00870 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLQVApplication(QXmlStreamReader &amp;xmlReader)
<a name="l00871"></a>00871 {
<a name="l00872"></a>00872     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;QVApplication&quot;</span>);
<a name="l00873"></a>00873 
<a name="l00874"></a>00874     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l00875"></a>00875         xmlReader.readNext();
<a name="l00876"></a>00876 
<a name="l00877"></a>00877         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l00878"></a>00878             <span class="keywordflow">break</span>;
<a name="l00879"></a>00879 
<a name="l00880"></a>00880         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l00881"></a>00881             <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;Nodes&quot;</span>)
<a name="l00882"></a>00882                 readXMLNodes(xmlReader);
<a name="l00883"></a>00883             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;Links&quot;</span>)
<a name="l00884"></a>00884                 readXMLLinks(xmlReader);
<a name="l00885"></a>00885             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;Groups&quot;</span>)
<a name="l00886"></a>00886                 readXMLGroups(xmlReader);
<a name="l00887"></a>00887             <span class="keywordflow">else</span>
<a name="l00888"></a>00888                 readXMLUnknownElement(xmlReader);
<a name="l00889"></a>00889         }
<a name="l00890"></a>00890      }
<a name="l00891"></a>00891 
<a name="l00892"></a>00892     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00893"></a>00893 }
<a name="l00894"></a>00894 
<a name="l00895"></a>00895 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLNodes(QXmlStreamReader &amp;xmlReader)
<a name="l00896"></a>00896 {
<a name="l00897"></a>00897     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;Nodes&quot;</span>);
<a name="l00898"></a>00898 
<a name="l00899"></a>00899     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l00900"></a>00900         xmlReader.readNext();
<a name="l00901"></a>00901 
<a name="l00902"></a>00902         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l00903"></a>00903             <span class="keywordflow">break</span>;
<a name="l00904"></a>00904 
<a name="l00905"></a>00905         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l00906"></a>00906             <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;Node&quot;</span>)
<a name="l00907"></a>00907                 readXMLNode(xmlReader);
<a name="l00908"></a>00908             <span class="keywordflow">else</span>
<a name="l00909"></a>00909                 readXMLUnknownElement(xmlReader);
<a name="l00910"></a>00910         }
<a name="l00911"></a>00911      }
<a name="l00912"></a>00912 
<a name="l00913"></a>00913     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00914"></a>00914 }
<a name="l00915"></a>00915 
<a name="l00916"></a>00916 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLNode(QXmlStreamReader &amp;xmlReader)
<a name="l00917"></a>00917 {
<a name="l00918"></a>00918     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;Node&quot;</span>);
<a name="l00919"></a>00919 
<a name="l00920"></a>00920     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l00921"></a>00921     QString type = attributes.value(<span class="stringliteral">&quot;Type&quot;</span>).toString();
<a name="l00922"></a>00922     QString XMLid = attributes.value(<span class="stringliteral">&quot;Id&quot;</span>).toString();
<a name="l00923"></a>00923     QString name = attributes.value(<span class="stringliteral">&quot;Name&quot;</span>).toString();
<a name="l00924"></a>00924     QString x = attributes.value(<span class="stringliteral">&quot;X&quot;</span>).toString();
<a name="l00925"></a>00925     QString y = attributes.value(<span class="stringliteral">&quot;Y&quot;</span>).toString();
<a name="l00926"></a>00926 
<a name="l00927"></a>00927 
<a name="l00928"></a>00928     uint itemId = addItem(type, name);
<a name="l00929"></a>00929 <span class="comment">//      qApp-&gt;processEvents();</span>
<a name="l00930"></a>00930     XMLId_To_ContainersId.insert(XMLid.toInt(), itemId);
<a name="l00931"></a>00931     slate.moveNode(itemId, QPointF(x.toFloat(), y.toFloat()));
<a name="l00932"></a>00932 
<a name="l00933"></a>00933     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l00934"></a>00934         xmlReader.readNext();
<a name="l00935"></a>00935 
<a name="l00936"></a>00936         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l00937"></a>00937             <span class="keywordflow">break</span>;
<a name="l00938"></a>00938 
<a name="l00939"></a>00939         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l00940"></a>00940             <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;Property&quot;</span>)
<a name="l00941"></a>00941                 readXMLProperty(xmlReader, itemId);
<a name="l00942"></a>00942             <span class="keywordflow">else</span>
<a name="l00943"></a>00943                 readXMLUnknownElement(xmlReader);
<a name="l00944"></a>00944         }
<a name="l00945"></a>00945      }
<a name="l00946"></a>00946 
<a name="l00947"></a>00947     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00948"></a>00948 }
<a name="l00949"></a>00949 
<a name="l00950"></a>00950 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLProperty(QXmlStreamReader &amp;xmlReader, uint <span class="keywordtype">id</span>)
<a name="l00951"></a>00951 {
<a name="l00952"></a>00952     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;Property&quot;</span>);
<a name="l00953"></a>00953 
<a name="l00954"></a>00954     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l00955"></a>00955     QString name = attributes.value(<span class="stringliteral">&quot;Name&quot;</span>).toString();
<a name="l00956"></a>00956     QString value = attributes.value(<span class="stringliteral">&quot;Value&quot;</span>).toString();
<a name="l00957"></a>00957 
<a name="l00958"></a>00958     <span class="keywordflow">if</span> (containers.contains(<span class="keywordtype">id</span>)) {
<a name="l00959"></a>00959         <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *cont = containers.value(<span class="keywordtype">id</span>);
<a name="l00960"></a>00960 
<a name="l00961"></a>00961         <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">int</span>&gt;(name)) {
<a name="l00962"></a>00962             cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<span class="keywordtype">int</span>&gt;(name, value.toInt());
<a name="l00963"></a>00963             propertyChanges.insert(getAbsPropName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(<span class="keywordtype">id</span>), name), PropertyChange(<span class="keywordtype">id</span>, name, QVariant(value.toInt())));
<a name="l00964"></a>00964         }
<a name="l00965"></a>00965         <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">float</span>&gt;(name)) {
<a name="l00966"></a>00966             cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<span class="keywordtype">float</span>&gt;(name, value.toFloat());
<a name="l00967"></a>00967             propertyChanges.insert(getAbsPropName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(<span class="keywordtype">id</span>), name), PropertyChange(<span class="keywordtype">id</span>, name, QVariant(value.toFloat())));
<a name="l00968"></a>00968         }
<a name="l00969"></a>00969         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">bool</span>&gt;(name)) {
<a name="l00970"></a>00970             cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<span class="keywordtype">bool</span>&gt;(name, (value == <span class="stringliteral">&quot;true&quot;</span> ? <span class="keyword">true</span> : <span class="keyword">false</span>));
<a name="l00971"></a>00971             propertyChanges.insert(getAbsPropName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(<span class="keywordtype">id</span>), name), PropertyChange(<span class="keywordtype">id</span>, name, QVariant((value == <span class="stringliteral">&quot;true&quot;</span> ? <span class="keyword">true</span> : <span class="keyword">false</span>))));
<a name="l00972"></a>00972         }
<a name="l00973"></a>00973         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;<span class="keywordtype">double</span>&gt;(name)) {
<a name="l00974"></a>00974             cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;<span class="keywordtype">double</span>&gt;(name, value.toDouble());
<a name="l00975"></a>00975             propertyChanges.insert(getAbsPropName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(<span class="keywordtype">id</span>), name), PropertyChange(<span class="keywordtype">id</span>, name, QVariant(value.toDouble())));
<a name="l00976"></a>00976         }
<a name="l00977"></a>00977         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cont-&gt;<a class="code" href="classQVPropertyContainer.html#afdd65a88f713e0031ac4847485acfce4" title="Checks if a property is of a given type.">isType</a>&lt;QString&gt;(name)) {
<a name="l00978"></a>00978             cont-&gt;<a class="code" href="classQVPropertyContainer.html#a0dc180ef52afef64e3d2522c91e7118c" title="Sets value for property.">setPropertyValue</a>&lt;QString&gt;(name, value);
<a name="l00979"></a>00979             propertyChanges.insert(getAbsPropName(QString(<span class="stringliteral">&quot;%1&quot;</span>).arg(<span class="keywordtype">id</span>), name), PropertyChange(<span class="keywordtype">id</span>, name, QVariant(value)));
<a name="l00980"></a>00980         }
<a name="l00981"></a>00981     }
<a name="l00982"></a>00982 
<a name="l00983"></a>00983     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l00984"></a>00984         xmlReader.readNext();
<a name="l00985"></a>00985 
<a name="l00986"></a>00986         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l00987"></a>00987             <span class="keywordflow">break</span>;
<a name="l00988"></a>00988 
<a name="l00989"></a>00989         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l00990"></a>00990             readXMLUnknownElement(xmlReader);
<a name="l00991"></a>00991         }
<a name="l00992"></a>00992      }
<a name="l00993"></a>00993 
<a name="l00994"></a>00994     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00995"></a>00995 }
<a name="l00996"></a>00996 
<a name="l00997"></a>00997 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLLinks(QXmlStreamReader &amp;xmlReader)
<a name="l00998"></a>00998 {
<a name="l00999"></a>00999     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;Links&quot;</span>);
<a name="l01000"></a>01000 
<a name="l01001"></a>01001     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01002"></a>01002         xmlReader.readNext();
<a name="l01003"></a>01003 
<a name="l01004"></a>01004         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01005"></a>01005             <span class="keywordflow">break</span>;
<a name="l01006"></a>01006 
<a name="l01007"></a>01007         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01008"></a>01008             <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;AsynchronousLink&quot;</span>)
<a name="l01009"></a>01009                 readXMLAsynchronousLink(xmlReader);
<a name="l01010"></a>01010             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;SynchronousLink&quot;</span>)
<a name="l01011"></a>01011                 readXMLSynchronousLink(xmlReader);
<a name="l01012"></a>01012             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;SequentialLink&quot;</span>)
<a name="l01013"></a>01013                 readXMLSequentialLink(xmlReader);
<a name="l01014"></a>01014             <span class="keywordflow">else</span>
<a name="l01015"></a>01015                 readXMLUnknownElement(xmlReader);
<a name="l01016"></a>01016         }
<a name="l01017"></a>01017      }
<a name="l01018"></a>01018 
<a name="l01019"></a>01019     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01020"></a>01020 }
<a name="l01021"></a>01021 
<a name="l01022"></a>01022 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLAsynchronousLink(QXmlStreamReader &amp;xmlReader)
<a name="l01023"></a>01023 {
<a name="l01024"></a>01024     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;AsynchronousLink&quot;</span>);
<a name="l01025"></a>01025 
<a name="l01026"></a>01026     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l01027"></a>01027     QString fromId = attributes.value(<span class="stringliteral">&quot;FromId&quot;</span>).toString();
<a name="l01028"></a>01028     QString fromProp = attributes.value(<span class="stringliteral">&quot;FromProp&quot;</span>).toString();
<a name="l01029"></a>01029     QString toId = attributes.value(<span class="stringliteral">&quot;ToId&quot;</span>).toString();
<a name="l01030"></a>01030     QString toProp = attributes.value(<span class="stringliteral">&quot;ToProp&quot;</span>).toString();
<a name="l01031"></a>01031 
<a name="l01032"></a>01032     addLink(XMLId_To_ContainersId.value(fromId.toUInt()), fromProp, XMLId_To_ContainersId.value(toId.toUInt()), toProp, <span class="keyword">false</span>, <span class="keyword">false</span>);
<a name="l01033"></a>01033 
<a name="l01034"></a>01034     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01035"></a>01035         xmlReader.readNext();
<a name="l01036"></a>01036 
<a name="l01037"></a>01037         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01038"></a>01038             <span class="keywordflow">break</span>;
<a name="l01039"></a>01039 
<a name="l01040"></a>01040         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01041"></a>01041             readXMLUnknownElement(xmlReader);
<a name="l01042"></a>01042         }
<a name="l01043"></a>01043      }
<a name="l01044"></a>01044 
<a name="l01045"></a>01045     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01046"></a>01046 }
<a name="l01047"></a>01047 
<a name="l01048"></a>01048 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLSynchronousLink(QXmlStreamReader &amp;xmlReader)
<a name="l01049"></a>01049 {
<a name="l01050"></a>01050     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;SynchronousLink&quot;</span>);
<a name="l01051"></a>01051 
<a name="l01052"></a>01052     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l01053"></a>01053     QString fromId = attributes.value(<span class="stringliteral">&quot;FromId&quot;</span>).toString();
<a name="l01054"></a>01054     QString fromProp = attributes.value(<span class="stringliteral">&quot;FromProp&quot;</span>).toString();
<a name="l01055"></a>01055     QString toId = attributes.value(<span class="stringliteral">&quot;ToId&quot;</span>).toString();
<a name="l01056"></a>01056     QString toProp = attributes.value(<span class="stringliteral">&quot;ToProp&quot;</span>).toString();
<a name="l01057"></a>01057 
<a name="l01058"></a>01058     addLink(XMLId_To_ContainersId.value(fromId.toUInt()), fromProp, XMLId_To_ContainersId.value(toId.toUInt()), toProp, <span class="keyword">true</span>, <span class="keyword">false</span>);
<a name="l01059"></a>01059 
<a name="l01060"></a>01060     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01061"></a>01061         xmlReader.readNext();
<a name="l01062"></a>01062 
<a name="l01063"></a>01063         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01064"></a>01064             <span class="keywordflow">break</span>;
<a name="l01065"></a>01065 
<a name="l01066"></a>01066         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01067"></a>01067             readXMLUnknownElement(xmlReader);
<a name="l01068"></a>01068         }
<a name="l01069"></a>01069      }
<a name="l01070"></a>01070 
<a name="l01071"></a>01071     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01072"></a>01072 }
<a name="l01073"></a>01073 
<a name="l01074"></a>01074 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLSequentialLink(QXmlStreamReader &amp;xmlReader)
<a name="l01075"></a>01075 {
<a name="l01076"></a>01076     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;SequentialLink&quot;</span>);
<a name="l01077"></a>01077 
<a name="l01078"></a>01078     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l01079"></a>01079     QString fromId = attributes.value(<span class="stringliteral">&quot;FromId&quot;</span>).toString();
<a name="l01080"></a>01080     QString fromProp = attributes.value(<span class="stringliteral">&quot;FromProp&quot;</span>).toString();
<a name="l01081"></a>01081     QString toId = attributes.value(<span class="stringliteral">&quot;ToId&quot;</span>).toString();
<a name="l01082"></a>01082     QString toProp = attributes.value(<span class="stringliteral">&quot;ToProp&quot;</span>).toString();
<a name="l01083"></a>01083 
<a name="l01084"></a>01084     addLink(XMLId_To_ContainersId.value(fromId.toUInt()), fromProp, XMLId_To_ContainersId.value(toId.toUInt()), toProp, <span class="keyword">false</span>, <span class="keyword">true</span>);
<a name="l01085"></a>01085 
<a name="l01086"></a>01086     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01087"></a>01087         xmlReader.readNext();
<a name="l01088"></a>01088 
<a name="l01089"></a>01089         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01090"></a>01090             <span class="keywordflow">break</span>;
<a name="l01091"></a>01091 
<a name="l01092"></a>01092         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01093"></a>01093             readXMLUnknownElement(xmlReader);
<a name="l01094"></a>01094         }
<a name="l01095"></a>01095      }
<a name="l01096"></a>01096 
<a name="l01097"></a>01097     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01098"></a>01098 }
<a name="l01099"></a>01099 
<a name="l01100"></a>01100 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLGroups(QXmlStreamReader &amp;xmlReader) {
<a name="l01101"></a>01101     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;Groups&quot;</span>);
<a name="l01102"></a>01102 
<a name="l01103"></a>01103     QList&lt;GroupInfo&gt; groupInfos;
<a name="l01104"></a>01104 
<a name="l01105"></a>01105     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01106"></a>01106         xmlReader.readNext();
<a name="l01107"></a>01107 
<a name="l01108"></a>01108         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01109"></a>01109             <span class="keywordflow">break</span>;
<a name="l01110"></a>01110 
<a name="l01111"></a>01111         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01112"></a>01112             <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;Group&quot;</span>)
<a name="l01113"></a>01113                 readXMLGroup(xmlReader, groupInfos);
<a name="l01114"></a>01114             <span class="keywordflow">else</span>
<a name="l01115"></a>01115                 readXMLUnknownElement(xmlReader);
<a name="l01116"></a>01116         }
<a name="l01117"></a>01117      }
<a name="l01118"></a>01118 
<a name="l01119"></a>01119     createGroups(groupInfos, XMLId_To_ContainersId);
<a name="l01120"></a>01120 
<a name="l01121"></a>01121     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01122"></a>01122 }
<a name="l01123"></a>01123 
<a name="l01124"></a>01124 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLGroup(QXmlStreamReader &amp;xmlReader, QList&lt;GroupInfo&gt; &amp;groupInfos) {
<a name="l01125"></a>01125     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;Group&quot;</span>);
<a name="l01126"></a>01126 
<a name="l01127"></a>01127     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l01128"></a>01128     QString XMLid = attributes.value(<span class="stringliteral">&quot;Id&quot;</span>).toString();
<a name="l01129"></a>01129     QString name = attributes.value(<span class="stringliteral">&quot;Name&quot;</span>).toString();
<a name="l01130"></a>01130     QString x = attributes.value(<span class="stringliteral">&quot;X&quot;</span>).toString();
<a name="l01131"></a>01131     QString y = attributes.value(<span class="stringliteral">&quot;Y&quot;</span>).toString();
<a name="l01132"></a>01132 
<a name="l01133"></a>01133     GroupInfo groupInfo(XMLid.toInt(), name);
<a name="l01134"></a>01134     groupInfo.setPos(QPointF(x.toFloat(), y.toFloat()));
<a name="l01135"></a>01135     groupInfo.setAbstract(<span class="keyword">false</span>);
<a name="l01136"></a>01136 
<a name="l01137"></a>01137     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01138"></a>01138         xmlReader.readNext();
<a name="l01139"></a>01139 
<a name="l01140"></a>01140         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01141"></a>01141             <span class="keywordflow">break</span>;
<a name="l01142"></a>01142 
<a name="l01143"></a>01143         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01144"></a>01144             <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;ChildNode&quot;</span>)
<a name="l01145"></a>01145                 readXMLChildNode(xmlReader, groupInfo);
<a name="l01146"></a>01146             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;ChildGroup&quot;</span>)
<a name="l01147"></a>01147                 readXMLChildGroup(xmlReader, groupInfo);
<a name="l01148"></a>01148             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;VisibleNodeLink&quot;</span>)
<a name="l01149"></a>01149                 readXMLVisibleNodeLink(xmlReader, groupInfo);
<a name="l01150"></a>01150             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xmlReader.name() == <span class="stringliteral">&quot;VisibleGroupLink&quot;</span>)
<a name="l01151"></a>01151                 readXMLVisibleGroupLink(xmlReader, groupInfo);
<a name="l01152"></a>01152             <span class="keywordflow">else</span>
<a name="l01153"></a>01153                 readXMLUnknownElement(xmlReader);
<a name="l01154"></a>01154         }
<a name="l01155"></a>01155      }
<a name="l01156"></a>01156 
<a name="l01157"></a>01157     groupInfos.append(groupInfo);
<a name="l01158"></a>01158 
<a name="l01159"></a>01159     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01160"></a>01160 }
<a name="l01161"></a>01161 
<a name="l01162"></a>01162 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLChildNode(QXmlStreamReader &amp;xmlReader, GroupInfo &amp;groupInfo) {
<a name="l01163"></a>01163     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;ChildNode&quot;</span>);
<a name="l01164"></a>01164 
<a name="l01165"></a>01165     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l01166"></a>01166     QString XMLid = attributes.value(<span class="stringliteral">&quot;Id&quot;</span>).toString();
<a name="l01167"></a>01167 
<a name="l01168"></a>01168     groupInfo.addNode(XMLid.toInt());
<a name="l01169"></a>01169 
<a name="l01170"></a>01170     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01171"></a>01171         xmlReader.readNext();
<a name="l01172"></a>01172 
<a name="l01173"></a>01173         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01174"></a>01174             <span class="keywordflow">break</span>;
<a name="l01175"></a>01175 
<a name="l01176"></a>01176         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01177"></a>01177             readXMLUnknownElement(xmlReader);
<a name="l01178"></a>01178         }
<a name="l01179"></a>01179      }
<a name="l01180"></a>01180 
<a name="l01181"></a>01181     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01182"></a>01182 }
<a name="l01183"></a>01183 
<a name="l01184"></a>01184 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLChildGroup(QXmlStreamReader &amp;xmlReader, GroupInfo &amp;groupInfo) {
<a name="l01185"></a>01185     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;ChildGroup&quot;</span>);
<a name="l01186"></a>01186 
<a name="l01187"></a>01187     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l01188"></a>01188     QString XMLid = attributes.value(<span class="stringliteral">&quot;Id&quot;</span>).toString();
<a name="l01189"></a>01189 
<a name="l01190"></a>01190     groupInfo.addSubgroup(XMLid.toInt());
<a name="l01191"></a>01191 
<a name="l01192"></a>01192     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01193"></a>01193         xmlReader.readNext();
<a name="l01194"></a>01194 
<a name="l01195"></a>01195         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01196"></a>01196             <span class="keywordflow">break</span>;
<a name="l01197"></a>01197 
<a name="l01198"></a>01198         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01199"></a>01199             readXMLUnknownElement(xmlReader);
<a name="l01200"></a>01200         }
<a name="l01201"></a>01201      }
<a name="l01202"></a>01202 
<a name="l01203"></a>01203     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01204"></a>01204 }
<a name="l01205"></a>01205 
<a name="l01206"></a>01206 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLVisibleNodeLink(QXmlStreamReader &amp;xmlReader, GroupInfo &amp;groupInfo) {
<a name="l01207"></a>01207     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;VisibleNodeLink&quot;</span>);
<a name="l01208"></a>01208 
<a name="l01209"></a>01209     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l01210"></a>01210     QString XMLid = attributes.value(<span class="stringliteral">&quot;ChildNode&quot;</span>).toString();
<a name="l01211"></a>01211     QString prop = attributes.value(<span class="stringliteral">&quot;Prop&quot;</span>).toString();
<a name="l01212"></a>01212     QString direction = attributes.value(<span class="stringliteral">&quot;Direction&quot;</span>).toString();
<a name="l01213"></a>01213 
<a name="l01214"></a>01214     groupInfo.addNodeLink(LinkInfo(XMLid.toInt(), prop, direction == <span class="stringliteral">&quot;Input&quot;</span> ? <span class="keyword">true</span> : <span class="keyword">false</span>));
<a name="l01215"></a>01215 
<a name="l01216"></a>01216     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01217"></a>01217         xmlReader.readNext();
<a name="l01218"></a>01218 
<a name="l01219"></a>01219         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01220"></a>01220             <span class="keywordflow">break</span>;
<a name="l01221"></a>01221 
<a name="l01222"></a>01222         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01223"></a>01223             readXMLUnknownElement(xmlReader);
<a name="l01224"></a>01224         }
<a name="l01225"></a>01225      }
<a name="l01226"></a>01226 
<a name="l01227"></a>01227     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01228"></a>01228 }
<a name="l01229"></a>01229 
<a name="l01230"></a>01230 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLVisibleGroupLink(QXmlStreamReader &amp;xmlReader, GroupInfo &amp;groupInfo) {
<a name="l01231"></a>01231     Q_ASSERT(xmlReader.isStartElement() &amp;&amp; xmlReader.name() == <span class="stringliteral">&quot;VisibleGroupLink&quot;</span>);
<a name="l01232"></a>01232 
<a name="l01233"></a>01233     QXmlStreamAttributes attributes = xmlReader.attributes();
<a name="l01234"></a>01234     QString XMLid = attributes.value(<span class="stringliteral">&quot;ChildGroup&quot;</span>).toString();
<a name="l01235"></a>01235     QString prop = attributes.value(<span class="stringliteral">&quot;Prop&quot;</span>).toString();
<a name="l01236"></a>01236     QString direction = attributes.value(<span class="stringliteral">&quot;Direction&quot;</span>).toString();
<a name="l01237"></a>01237 
<a name="l01238"></a>01238     groupInfo.addSubgroupLink(LinkInfo(XMLid.toInt(), prop, direction == <span class="stringliteral">&quot;Input&quot;</span> ? <span class="keyword">true</span> : <span class="keyword">false</span>));
<a name="l01239"></a>01239 
<a name="l01240"></a>01240     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01241"></a>01241         xmlReader.readNext();
<a name="l01242"></a>01242 
<a name="l01243"></a>01243         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01244"></a>01244             <span class="keywordflow">break</span>;
<a name="l01245"></a>01245 
<a name="l01246"></a>01246         <span class="keywordflow">if</span> (xmlReader.isStartElement()) {
<a name="l01247"></a>01247             readXMLUnknownElement(xmlReader);
<a name="l01248"></a>01248         }
<a name="l01249"></a>01249      }
<a name="l01250"></a>01250 
<a name="l01251"></a>01251     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01252"></a>01252 }
<a name="l01253"></a>01253 
<a name="l01254"></a>01254 <span class="keywordtype">bool</span> QVDesignerGUI::readXMLUnknownElement(QXmlStreamReader &amp;xmlReader)
<a name="l01255"></a>01255 {
<a name="l01256"></a>01256     Q_ASSERT(xmlReader.isStartElement());
<a name="l01257"></a>01257 
<a name="l01258"></a>01258 <span class="comment">// std::cout &lt;&lt; &quot;Algo extaño\n&quot;;</span>
<a name="l01259"></a>01259 
<a name="l01260"></a>01260     <span class="keywordflow">while</span> (!xmlReader.atEnd()) {
<a name="l01261"></a>01261         xmlReader.readNext();
<a name="l01262"></a>01262 
<a name="l01263"></a>01263         <span class="keywordflow">if</span> (xmlReader.isEndElement())
<a name="l01264"></a>01264             <span class="keywordflow">break</span>;
<a name="l01265"></a>01265 
<a name="l01266"></a>01266         <span class="keywordflow">if</span> (xmlReader.isStartElement())
<a name="l01267"></a>01267             readXMLUnknownElement(xmlReader);
<a name="l01268"></a>01268      }
<a name="l01269"></a>01269 
<a name="l01270"></a>01270     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01271"></a>01271 }
<a name="l01272"></a>01272 
</pre></div></div>
</td></tr></table>

<br /><hr><br />
<center><a href="http://perception.inf.um.es/QVision">QVision framework</a>.
<a href="http://perception.inf.um.es">PARP research group</a>.
Copyright &copy; 2007, 2008, 2009, 2010, 2011.</center>
<br />
</body>
</html>
